新导航组件的建议实践在I / O中展示,其中包含以下模板和提议的哲学:
典型的应用程序通常都有一个详细视图,其中包含一个CollapsingToolbar。如何在该架构下构建它?
答案 0 :(得分:2)
一个典型的应用程序通常都有一个带有CollapsingToolbar的详细视图。一个人将如何在这种架构下构建它?
好问题!我对此也作了一些努力,得出的结论是,应该有一个带有NavHostFragment的Activity,理想情况下,没有别的。这使您能够最大程度地灵活显示(或不显示)每个屏幕所需的内容。重要的是,确保您的主题删除了ActionBar:
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
哪个会引出您的下一个问题...
将工具栏移动到每个Fragment XML吗?
在我看来,是的!您通常使用ActionBar的所有操作都可以通过工具栏完成。以下是一个简短的代码片段,展示了如何使用工具栏来完成您过去使用ActionBar所做的最重要的事情(向上导航,标题,选项菜单等):
toolbar.apply {
setNavigationOnClickListener { findNavController().navigateUp() }
setTitle(R.string.toolbar_title)
inflateMenu(R.menu.fragment_menu)
setOnMenuItemClickListener(::onMenuItemClick)
}
以编程方式实现折叠式工具栏吗?
这取决于您要尝试执行的操作,但是很可能不需要这样做。您可以将AppBarLayout,CollapsingToolbarLayout和Toolbar放到布局中,然后像平常一样使用它们。给您的AppBarLayout一个ActionBar主题叠加层。这是一个示例:
<?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:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/collapsingToolbarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentScrim="@color/primary"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:navigationIcon="@drawable/ic_up_white"/>
...
将细节片段移动到自己的活动中(无论如何也可以使用自己的深层链接)并“打破”哲学?
不需要上述内容,对吗?这种方法足够灵活,可以轻松地在一个导航图中容纳多个级别,并且仍然能够自定义图中每个目标的外观和行为(包括类似ActionBar的功能)。
答案 1 :(得分:0)
尝试
appBarLayout = (AppBarLayout) findViewById(R.id.appbar);
if(expandToolbar){
appBarLayout.setExpanded(true,true);
}else{
appBarLayout.setExpanded(false,true);
}
这是一个有用的链接 disable expand on CollapsingToolbarLayout for certain fragments
也适用于其他想要更改其工具栏某些部分的人 您应该使用单独的XML编写自定义工具栏视图,并尝试在详细信息中添加自定义视图Fragment语法化然后隐藏未使用的元素 如果有的话,则使用旧工具栏。
setSupportActionBar(toolbar);
View logo = getLayoutInflater().inflate(R.layout.view_logo, null);
toolbar.addView(logo);
这是您如何隐藏不需要的视图
for (int i = 0; i < toolbar.getChildCount(); ++i) {
View child = toolbar.getChildAt(i);
// here u can hide all text views for example.
if (child instanceof TextView) {
child.setVisibility(View.GONE );
}
}
这种方式比编写两个活动要好得多
答案 2 :(得分:0)
我们假设我们有
应用所需的工具栏所有可能的外观都应在单个工具栏中实现,并且可控制的是当前活动的片段。 在不违反依赖性反转原则的情况下,需要活动工具栏上的某个功能的所有Fragment都必须实现一个接口。您可以使用OnBackStackChangedListener来检查视图的更新
Table
您可能还记得片段需要OptionsMenu时的原理。
通常,我建议仅由一个活动控制一个底部导航栏,并在片段中具有多个工具栏。这样可以降低复杂性,并使应用程序的组件更加独立。