请帮我解释一下... 我的 Activity
中有一个导航抽屉,并且它与 Toolbar
(像 ActionBar
) 同步。该 Activity 有几个片段,在不同的片段中,我需要使用不同的 AppBar
模式(在一个片段中是视差,另一个片段中是简单的)。所以,我认为我应该在每个具有 AppBar 和内容的片段中设置 CoordinatorLayout
。
但是我如何替换最后一个工具栏以保存与抽屉的同步?或者这种方法是错误的,我需要采用其他方法吗?
请帮我解释一下... 我的 Activity
中有一个导航抽屉,并且它与 Toolbar
(像 ActionBar
) 同步。该 Activity 有几个片段,在不同的片段中,我需要使用不同的 AppBar
模式(在一个片段中是视差,另一个片段中是简单的)。所以,我认为我应该在每个具有 AppBar 和内容的片段中设置 CoordinatorLayout
。
但是我如何替换最后一个工具栏以保存与抽屉的同步?或者这种方法是错误的,我需要采用其他方法吗?
我不确定我的方法是否好用,但我尝试添加了这个公共方法到我的活动中:
public void setToolbar(Toolbar toolbar) {
if(toolbar != null) {
setSupportActionBar(toolbar);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
} else {
drawer.setDrawerListener(null);
}
}
我在所有片段中添加了以下内容:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
((MainActivity)getActivity()).setToolbar(toolbar);
}
@Override
public void onDestroyView() {
((MainActivity)getActivity()).setToolbar(null);
super.onDestroyView();
}
它运行良好,但我不确定它是否会导致内存泄漏或任何其他性能问题。也许有人可以帮忙解决吗?
Fragment
访问主要的DrawerLayout
:AppCompatActivity actionBar = (AppCompatActivity) getActivity();
actionBar.setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) actionBar.findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
getActivity(), drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
应用栏(toolbar)
,例如具有不同选项菜单项的片段,您可以在指定了导航抽屉逻辑的主活动中制作一个公共方法。public void setToolbar(Toolbar toolbar, String title){
AppCompatActivity actionBar = this;
actionBar.setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout)actionBar.findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toogle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open, R.string.drawer_close);
drawer.addDrawerListener(toogle);
toogle.setDrawerIndicatorEnabled(true);
toogle.syncState();
if(toolbar != null)
toolbar.setTitle(title);
}
onCreateView()
方法中填充它来实现。toolbarFragment = (Toolbar)getActivity().findViewById(R.id.toolbar);
R.id.toolbar
是您在布局文件中指定的工具栏的ID,它是您在主活动中用于主工具栏的相同ID。
setToolbar(Toolbar toolbar, String title)
,例如:
((MainActivity)getActivity()).setToolbar(toolbarFragment, "Some title");
setHasOptionsMenu(true);
onCreate()
或onCreateView()
方法中,然后您可以像这样重写onCreateOptionsMenu()
方法。@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.custom_menu1, menu);
}
我有同样的问题。我想只在主Fragment中添加CollapsingToolbar。通过从Activity中删除Toolbar,我失去了汉堡按钮和对drawerLayout的连接。为了解决这个问题,我没有删除Activity中的工具栏,而是使其透明。并且对于每个Fragment,我都创建了自己的自定义工具栏。最后,我有一个与抽屉链接的汉堡按钮和一个功能良好的CollapsingToolbar。我知道这是一个权宜之计。但我找不到其他方法
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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=".activity.MainActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:theme="@style/AppTheme.AppBarOverlay"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</com.google.android.material.appbar.AppBarLayout>
<include
android:id="@+id/include"
layout="@layout/content_main"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
AppBarLayout appBarLayout = findViewById(R.id.appbar);
appBarLayout.setOutlineProvider(null);
这适用于 Android sdk 版本 21。
DrawerLayout
和NavigationView
来创建导航抽屉,我认为最好的解决方案是为每个片段布局使用单独的DrawerLayout
,并针对每个片段在DrawerLayout
的主体中不同地使用AppBarLayout
。
DrawerLayout
,并在片段布局中使用了Toolbar
,在onCreateView
中将Toolbar
设置为ActionBar
并将其与DrawerLayout
同步。 - Denis SologubonCreateView
中如何与DrawerLayout
同步? 你是否为每个fragment的Toolbar
重新创建ActionBarDrawerToggle
? 你是否使用带有或不带有Toolbar
的DrawerLayout
构造函数? - jayeffkayonCreateView
中定义你的Toolbar
,然后将其设置为ActionBar
并与DrawerLayout
同步,就像在普通活动中一样。对于英文版本,我已经不记得如何在onCreateView
中定义Toolbar
以便它可以像使用DrawerLayout
一样使用ActionBar
了。 - Denis Sologub