折叠工具栏仅适用于导航视图中的一个片段

时间:2017-06-23 12:32:19

标签: java android xml android-layout android-fragments

问题

我有一个带有不同碎片的导航抽屉。每个Fragment都应使用默认工具栏,但需要折叠Fragment的{​​{1}}除外。

我的问题

如何在片段的工具栏之间切换?

5 个答案:

答案 0 :(得分:5)

似乎你想要实现这样的目标。

Nothing fancy

我使用常用​​工具栏进行了一项活动。切换到折叠工具栏片段时,我使工具栏透明,片段的工具栏接管。切换到其他片段时,工具栏的颜色保持不变。

这允许您在xml中管理完整的折叠工具栏的布局结构,逻辑保留在Fragment中。

希望这会有所帮助。请参阅gif链接。

Gist for gif

答案 1 :(得分:3)

您可以轻松地从Toolbar获取Fragment,然后在Toolbar内修改或更改Fragment的某些属性。

要从Toolbar获取Activity,您可以考虑使用此功能。

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);

现在,您需要对Toolbar函数中的onResume进行更改,然后在每次从Fragment内部onStop函数返回时撤消更改。否则,当从导航抽屉切换到其他Fragment时,Fragment中所做的更改也会被转移到其他片段。

但在您的情况下,我建议每个Fragment应该拥有Toolbar,以便它们不会相互冲突,并且可以根据需要进行修改。是的,请从Toolbar中移除Activity

所以在Toolbar的布局中添加Fragment就像这样。

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimaryDark"/>

然后在Fragment

中找到它
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment, container, false);
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);

    // Modify your Toolbar here. 
    // ... 
    // For example. 
    // toolbar.setBackground(R.color.red);

    // Create home button
    AppCompatActivity activity = (AppCompatActivity) getActivity();
    activity.setSupportActionBar(toolbar);
    activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

并覆盖onOptionsItemSelected功能。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case android.R.id.home:
            getActivity().onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

答案 2 :(得分:1)

我发现的最佳解决方案是轻松折叠,锁定它(将其保持在折叠模式)并解锁折叠工具栏。

private void collapseAppBar() {
    // Collapse the AppBarLayout with animation
    mAppBarLayout.setExpanded(false, true);
}

private void lockAppBar() {
    /* Disable the nestedScrolling to disable expanding the
     appBar with dragging the nestedScrollView below it */
    ViewCompat.setNestedScrollingEnabled(nestedScrollView, false);

    /* But still appBar is expandable with dragging the appBar itself
    and below code disables that too
     */
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
    AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
    behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
        @Override
        public boolean canDrag(AppBarLayout appBarLayout) {
            return false;
        }
    });
}

private void unLockAppBar() {
    ViewCompat.setNestedScrollingEnabled(nestedScrollView, true);

    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
    AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
    if (behavior != null) {
        behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
            @Override
            public boolean canDrag(AppBarLayout appBarLayout) {
                return true;
            }
        });
    }
}

我以这种方式使用这些功能:

    Fragment fragment = null;
    Class fragmentClass;
    switch (menuItem.getItemId()) {
        case R.id.fragment1:
            unLockAppBar();
            fragmentClass = first_Fragment.class;
            break;
        case R.id.fragment2:
            collapseAppBar();
            lockAppBar();
            fragmentClass = second_Fragment.class;
            break;
        case R.id.fragment3:
            collapseAppBar();
            lockAppBar();
            fragmentClass = third_Fragment.class;
            break;

答案 3 :(得分:0)

我正在将Jetpack's Navigation components与单个Activity和我的应用程序中的不同片段一起使用。

某些片段可从底部导航访问(并从Activity中获得Toolbar)。其他一些是“特殊”片段,并且具有自己的可折叠工具栏。

要实现此目的,我在“特殊”片段中通过“活动”中的此代码隐藏了“活动”中的工具栏:

// Handle toolbar changes in different Fragments
val navController = findNavController(R.id.nav_host_fragment)
navController.addOnDestinationChangedListener { _, destination, _ ->
    when (destination.id) {
        R.id.my_special_fragment_with_collapsible_toolbar -> {
            binding.toolbarMain.visibility = View.GONE
        }
        else -> {
            binding.toolbarMain.visibility = View.VISIBLE
        }
    }
}

答案 4 :(得分:0)

建议的做法是在片段中使用工具栏,而不是在活动中使用常见的工具栏。这样,您可以控制片段中工具栏的外观和行为。请参阅https://developer.android.com/guide/navigation/navigation-ui#support_app_bar_variations