导航架构组件 - 具有CollapsingToolbar的详细信息视图

问题描述 投票:28回答:3

新导航组件的拟议实践在I / O中提供,具有以下模板和建议的理念:

  1. 应用程序的一个活动
  2. 活动包含工具栏和底部导航栏

典型的应用程序通常具有包含CollapsingToolbar的详细视图。如何在该架构下构建它?

  • 将工具栏移动到每个片段XML?
  • 以编程方式实现折叠工具栏?
  • 将细节片段移动到它自己的活动(它可能会使用它自己的深层链接)并“打破”这个哲学?
android android-architecture-components android-jetpack android-architecture-navigation
3个回答
3
投票

典型的应用程序通常具有包含CollapsingToolbar的详细视图。如何在该架构下构建它?

好问题!我也在努力解决这个问题并得出结论,应该有一个带有NavHostFragment的Activity,理想情况下,没有别的。这使您可以灵活地显示(或不显示)每个屏幕所需的任何内容。重要的是,请确保您的主题删除ActionBar:

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

这导致你的下一个问题......

将工具栏移动到每个片段XML?

在我看来,是的!您通常使用ActionBar的所有内容都可以通过工具栏完成。这是一个快速的片段,展示了如何使用工具栏来执行过去使用ActionBar的最重要的事情(向上导航,标题,选项菜单等):

toolbar.apply {
    setNavigationOnClickListener { findNavController().navigateUp() }
    setTitle(R.string.toolbar_title)
    inflateMenu(R.menu.fragment_menu)
    setOnMenuItemClickListener(::onMenuItemClick)
}

以编程方式实现折叠工具栏?

这取决于你究竟想要做什么,但最有可能的是,没有必要这样做。您可以将AppBarLayout,CollapsingToolbarLayout和工具栏拖放到布局中,并像平常一样使用它们。为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的功能)。


0
投票

尝试

appBarLayout = (AppBarLayout) findViewById(R.id.appbar);


if(expandToolbar){
                appBarLayout.setExpanded(true,true);
            }else{
                appBarLayout.setExpanded(false,true);
            }

这是一个usufal链接disable expand on CollapsingToolbarLayout for certain fragments

也可以为其他人更改其工具的某些部分。您应该在单独的XML中编写自定义工具栏视图,并尝试在语法中夸大细节中的自定义视图,然后隐藏旧工具栏中未使用的元素(如果有)。

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

这种方式比编写两个活动要好得多


0
投票

我们假设我们有

  1. 应用程序的一个活动
  2. 活动包含工具栏和底部导航栏

应用程序所需的工具栏的所有可能外观都应在该单个工具栏中实现,并且可以作为当前活动的片段进行控制。不违反依赖性反转原则所有需要活动工具栏中的功能的片段必须实现接口。您可以使用OnBackStackChangedListener来检查视图的更新

getFragmentManager().addOnBackStackChangedListener(
    new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Fragment visibleFragment = ...
            if(visibleFragment instanceof ToolbarControlFragment) {
                if(visibleFragment.shouldExpandToolbar()) {
                    // set AppBarLayout expanded state
                }
                // ...
            }
        }
    }
);

当Fragment需要OptionsMenu时,您可能还记得这个原则。

我通常建议只有一个由活动控制的底部导航栏和碎片中的几个工具栏。这降低了复杂性并使应用程序的组件更加独立。

© www.soinside.com 2019 - 2024. All rights reserved.