工具栏 - 添加返回按钮

25

我正在尝试使用工具栏替代操作栏,但我无法弄清如何添加“向上”按钮以返回到上一个活动。

我找不到任何与其相关的方法。

我该如何添加“向上”按钮?

9个回答

34

我猜你想要的是这样的:

Toolbar toolbar = (Toolbar) findViewById(R.id.app_bar_detail);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

或者在使用Fragment时:

Toolbar toolbar = (Toolbar) view.findViewById(R.id.app_bar_detail);
((ActionBarActivity) getActivity()).setSupportActionBar(toolbar);
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

这将在你的工具栏中显示操作栏,但不用担心一切都会很好地配合在一起。如果您不想在操作栏下方显示任何阴影或背景,请更改vaules/styles.xml中的主题。

<style name="AppThmeme.Base" parent="Theme.AppCompat.NoActionBar">

9

如果您想知道为什么在使用片段时点击上按钮无效,您需要设置一个导航监听器,不确定为什么Google没有默认启用它:

protected fun setupToolbar(toolbar: Toolbar) {
    (activity as AppCompatActivity).run {
        setSupportActionBar(toolbar)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        toolbar.setNavigationOnClickListener { onBackPressed() }
    }
}

9
如果你想在XML中实现这个功能,你可以使用...
<android.support.v7.widget.Toolbar
            app:navigationIcon="?homeAsUpIndicator"
            ...

4

如果对于给定的活动,前一个活动始终相同,则可以使用parentActivityName属性来获得上/返回按钮。它可以在AndroidManifest.xml文件中如下所示:

<activity android:name=".DetailActivity" android:parentActivityName=".MainActivity">
     <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />
</activity>

假设从 MainActivity 打开了 DetailActivity。因此,当您在 DetailActivity 上时,工具栏将自动显示一个向左的箭头(参见屏幕截图):

enter image description here

当我们点击向左的箭头时,MainActivity 将被显示。

2
您需要添加这些行,以使返回按钮自动显示。
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

当返回按钮被点击时,自动返回到活动页面。

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

2

你可以在工具栏中添加自己的“向上”按钮,毕竟它只是一个ViewGroup。

你可以随心所欲地定制工具栏,在你的toolbar.xml文件或者无论你在布局中定义android.support.v7.widget.Toolbar的地方,像下面提供的示例那样添加你的“向上”按钮:

<android.support.v7.widget.Toolbar
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/toolbar"
   android:minHeight="?attr/actionBarSize"
   android:layout_height="?attr/actionBarSize"
   android:background="@drawable/color_toolbar"
   android:layout_width="match_parent">

   <ImageButton
       android:id="@+id/upButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:onClick="uphandler"
       android:src="@drawable/backbutton"
       android:layout_gravity="end"/>

</android.support.v7.widget.Toolbar>

现在,在您的活动中定义uphandler函数以侦听此up按钮:
public void uphandler(View v){
       this.finish();    // This will kill current activity, and if previous activity is still opened in background, it will come in front.
}

2

我认为调用getSupportActionBar().setHomeButtonEnabled(true);应该仍然有效,只要你已经调用了setSupportActionBar(toolbar);


0

如果您正在使用较新版本的Android Studio:

首先声明androidx而不是android的工具栏

 <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorAccent"
        app:popupTheme="@style/Theme.Sunshine.PopupOverlay" />

其次,在Activity.java中获取工具栏的引用并使用以下代码:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ActionBar ab= getSupportActionBar();
    ab.setDisplayHomeAsUpEnabled(true);

0
如果您正在使用导航组件,则在片段中添加返回按钮的方法如下:
在您的fragment.xml文件中:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".presentation.recipeitem.RecipeDetailsFragment">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_constraintTop_toTopOf="parent"
        android:elevation="4dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        />
.
.

然后在你的片段中,你会这样做
在 onViewCreated(..) 内部

val navController = findNavController()
val appBarConfiguration = AppBarConfiguration(navController.graph)
viewBinding.toolbar.setupWithNavController(navController, appBarConfiguration)

如果需要添加标题,则在onResume中使用此代码

    viewBinding.toolbar.title = "my title"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接