当前位置: 首页 > 知识库问答 >
问题:

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

马国源
2023-03-14

我有一个抽屉菜单,里面有不同的片段。每个片段都应该使用一个默认工具栏,除了一个片段需要折叠工具栏

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

共有3个答案

卢普松
2023-03-14

您可以轻松地从片段中获取工具栏,然后在片段中修改或更改该工具栏的某些属性。

要从您的< code>Activity中获取< code >工具栏,您可以考虑使用此。

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

现在,您需要在< code>onResume函数中的< code>Toolbar上进行更改,然后在每次从< code>onStop函数内的< code>Fragment返回时撤消更改。否则,当从导航抽屉切换到其他< code >片段时,在< code >片段中所做的更改也将延续到其他片段。

但在您的情况下,我建议每个Fragment都应该有自己的Toolbar,这样它们就不会相互冲突,并且可以根据需要进行修改。是的,从活动中删除工具栏

因此,将<code>工具栏</code>添加到<code>片段</code〕的布局中,如下所示。

<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"/>

然后在片段中找到它

@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);
}
莫英卓
2023-03-14

我发现最好的解决方案很容易崩溃,锁定它(保持在折叠模式)并解锁折叠工具栏。

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;
戚晨
2023-03-14

看来你想实现这样的目标。

我做了一个带有公共工具栏的活动。切换到折叠工具栏片段时,我使工具栏透明,片段的工具栏接管。切换到其他片段时,工具栏的颜色保持不变。

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

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

动图要点

 类似资料:
  • 问题内容: 我有一个这样布置的应用程序,mainactivity包含2个带有相应片段的选项卡,第一个片段具有可正常使用的回收站视图,我试图在人向上或向下滚动时添加视差效果,不是确保我是否应该将其添加到片段的xml或mainactivity的xml中,我将其添加到mainactivity的xml并将片段包含为我的recyclerview,不用说视差不起作用,现在应用程序无法打开,我立即获取NullP

  • 我正在我的应用程序中使用ViewPager进行滑动效果。 我使用pager.setPageMargin()使下一个视图和上一个视图可见,不幸的是我的下一个视图与当前视图重叠。 下面是我的代码 我在用寻呼机里的片段。我得到的输出与这个线程的附加,但需要视图被适当地放置与out over lapping 上图所标部分应在中心卡后面。

  • 我有一个ViewPagerContainer片段,在应用程序启动时加载。ViewPagerContainer片段将两个选项卡(选项卡A和选项卡B)添加到操作栏。选项卡B有两个项目的列表视图。 我所做的:我在选项卡B片段中的列表视图项上附加了一个click listener,这样当用户单击一个项时,它会在第一个片段(即选项卡B下)内打开另一个片段(子片段)。 我陷入困境的地方:当用户按下后退按钮时,

  • 我所有的片段都是通过(main Active)控制的,在main Active中实现了一个,所有的子片段都是通过抽屉布局的列表项点击推送的。我面临的问题是,在通过抽屉布局推送一个片段后,我想将抽屉图标更改为的后退图标,以便用户可以导航到以前的片段并处理android的回调。id.home在同一个片段中或在主活动中。

  • 我有一个片段,我想在其中使用折叠工具栏布局 当collapsing_toolbar展开时,我希望显示图像,当折叠时,我希望只有@id/custom_layout。custom_layout是一个带有文本视图和图像视图的相对布局。 我想要有完全相同的行为,就像我有以下行为一样: 而不是自定义布局。 为什么这是不工作?即使折叠ToobarLayout扩展我看到的ImageView和自定义布局。 !!注

  • 我试着从一个片段到主要片段。编译器不喜欢我的代码,但我不确定是什么问题。转换片段的最佳实践是什么? //这是我要导航到的主片段的xml 2019-07-12 17:49:45.091 959 4-9594/com.example.cribb E/AndroidRuntime:致命异常:主进程:com.example.cribb,PID:9594 Android.content.res.resour