我采用了“一个活动,多个片段”的方式为我的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);
}