不同片段的多个工具栏布局

时间:2018-01-01 19:38:45

标签: android android-layout android-fragments android-toolbar android-coordinatorlayout

我采用了"一个活动,多个片段"为我的Android(Xamarin)应用程序定义布局的方法。所有视图(片段)共享由BottomNavigationView管理的MainActivity,将每个片段添加到同一FrameLayout。但是,由于某些片段需要定义自己的AppBarLayouts,例如创建CollapsingToolbarLayout,我不能只创建FragmentTransaction并将这些片段放在同一个FrameLayout中容器,因为Toolbar是活动布局的一部分,因此不受片段管理。为每个片段添加和管理Toolbar似乎会适得其反。

到目前为止我尝试了什么:

  • 为每个变体设置FrameLayout,然后显示/隐藏 相应的(在MainActivity的布局中)制作时 FragmentTransaction
  • 使用全屏DialogFragment显示内容 在活动片段之上。
  • 转换"违规"碎片成一个 Activity(难以处理BottomNavigationView)。

MainActivity目前看起来像这样(省略了一些细节):

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    android:id="@+id/coordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <include
        android:id="@+id/appbar_main"
        layout="@layout/toolbar_main"/>

    <FrameLayout
        android:id="@+id/fragment_container"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <include
        android:id="@+id/bottombar"
        layout="@layout/toolbar_nav" />

</android.support.design.widget.CoordinatorLayout>

appbar_main布局(由MainActivity使用)

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true">

        <!-- logo layout -->
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="?attr/actionBarSize"
            android:orientation="horizontal"
            android:layout_gravity="center"
            android:paddingTop="10dp"
            android:paddingBottom="10dp">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

        </LinearLayout>

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

</android.support.design.widget.AppBarLayout>

appbar_collapsing layout (例如用于显示个人资料页面)

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="@drawable/toolbar_app_bg"
        app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

        <ffimageloading.views.ImageViewAsync
            android:id="@+id/imageViewCover"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            app:layout_collapseMode="parallax"
            app:layout_collapseParallaxMultiplier="0.9" />

        <ffimageloading.views.ImageViewAsync
            android:id="@+id/imageViewProfile"
            android:layout_width="100dp"
            android:layout_height="100dp"/>

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"/>

    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

上面提供的appbar_main布局非常简单,也是显示工具栏的主要方式。 appbar_collapsing与主要布局的不同之处在于,工具栏嵌套在CollapsingToolbarLayout中,以便在滚动时折叠,同时还可折叠两个ImageView。

非常感谢任何示例和advaree!

1 个答案:

答案 0 :(得分:0)

在底部布局的片段中,工具栏的需求不断变化。 在测试了不同的方法后,我得出结论:

val prod = x(0)

在此处调用此方法:

 private void createMenus(Toolbar actionBarToolBar, @MenuRes int menu){
        ((MainActivity) Objects.requireNonNull(getActivity())).setSupportActionBar(actionBarToolBar);
        actionBarToolBar.setTitle("");
        actionBarToolBar.inflateMenu(menu);
    }

然后重写:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        mRootView = inflater.inflate(R.layout.fragment_profile, container, false);
        createMenus(mToolbar,R.menu.profile_menu);
        setHasOptionsMenu(true);
        //add fragments to adapter
        //...

        return mRootView;
    }