请向我解释......我的Activity
中有导航抽屉,它与Toolbar
同步(如ActionBar
)。活动有很少的片段,在不同的片段中我需要使用不同的AppBar
模式(一个视差,另一个简单)。所以,我认为我应该在AppBar和内容的每个框架中设置CoordinatorLayout
。
但是如何在new上替换最后一个工具栏以保存与Drawer的同步?或者这是错误的方式,我需要把它变成别的吗?
答案 0 :(得分:9)
不确定我的方法是否合适,但我尝试将此公开方法添加到我的活动中:
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();
}
它工作正常,但我不确定它是否可能导致内存泄漏或任何其他性能问题。也许有人可以帮忙吗?
答案 1 :(得分:2)
您可以从以下代码访问每个DrawerLayout
的主Fragment
:
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();
答案 2 :(得分:1)
如果您想使用在导航栏中指定的appbar(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);
}
您也可以对导航抽屉中的其他片段重复此过程。虽然它对我有用,但我不知道这是否违反了活动或片段生命周期或导致记忆韭菜。
答案 3 :(得分:0)
我有同样的问题。我只想在主要片段中添加CollapsingToolbar。通过从“活动”中删除工具栏,我失去了汉堡包按钮以及与抽屉布局的连接。为了解决此问题,我没有删除活动中的工具栏并使之透明。对于每个片段,我创建了自己的自定义工具栏。最后,我有一个链接到抽屉的汉堡按钮和一个功能良好的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>
为了使AppBar完全不可见,我添加了
AppBarLayout appBarLayout = findViewById(R.id.appbar);
appBarLayout.setOutlineProvider(null);
这适用于SDK版本21的Android。
答案 4 :(得分:-2)
如果您使用DrawerLayout
和NavigationView
作为导航抽屉,那么根据我的最佳解决方案是为每个片段布局使用单独的DrawerLayout
并使用{{1 AppBarLayout
的主体在每个片段中的方式不同。