片段和导航抽屉的不同工具栏

时间:2016-01-26 13:41:23

标签: android android-fragments android-toolbar android-navigation-drawer

请向我解释......我的Activity中有导航抽屉,它与Toolbar同步(如ActionBar)。活动有很少的片段,在不同的片段中我需要使用不同的AppBar模式(一个视差,另一个简单)。所以,我认为我应该在AppBar和内容的每个框架中设置CoordinatorLayout
但是如何在new上替换最后一个工具栏以保存与Drawer的同步?或者这是错误的方式,我需要把它变成别的吗?

5 个答案:

答案 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)

如果您使用DrawerLayoutNavigationView作为导航抽屉,那么根据我的最佳解决方案是为每个片段布局使用单独的DrawerLayout并使用{{1 AppBarLayout的主体在每个片段中的方式不同。