我正在尝试使用工具栏替代操作栏,但我无法弄清如何添加“向上”按钮以返回到上一个活动。
我找不到任何与其相关的方法。
我该如何添加“向上”按钮?
我猜你想要的是这样的:
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">
如果您想知道为什么在使用片段时点击上按钮无效,您需要设置一个导航监听器,不确定为什么Google没有默认启用它:
protected fun setupToolbar(toolbar: Toolbar) {
(activity as AppCompatActivity).run {
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
toolbar.setNavigationOnClickListener { onBackPressed() }
}
}
<android.support.v7.widget.Toolbar
app:navigationIcon="?homeAsUpIndicator"
...
如果对于给定的活动,前一个活动始终相同,则可以使用parentActivityName属性来获得上/返回按钮。它可以在AndroidManifest.xml文件中如下所示:
<activity android:name=".DetailActivity" android:parentActivityName=".MainActivity">
<meta-data android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
当返回按钮被点击时,自动返回到活动页面。
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
你可以在工具栏中添加自己的“向上”按钮,毕竟它只是一个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>
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.
}
我认为调用getSupportActionBar().setHomeButtonEnabled(true);
应该仍然有效,只要你已经调用了setSupportActionBar(toolbar);
如果您正在使用较新版本的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);
<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"