我采用了“一个活动,多个片段”的方式为我的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_主布局(由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_折叠布局(例如用于显示配置文件页)
<?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。
任何例子和建议都是非常感谢!

最佳答案

在底部布局的片段中更改工具栏的需求。
在测试了不同的方法之后,我得出这样的结论:

 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;
    }

然后覆盖此:
@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.clear();
        inflater.inflate(R.menu.profile_menu, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }

07-24 09:44
查看更多