代码之家  ›  专栏  ›  技术社区  ›  HelloCW

当我在androidstudio中使用CoordinatorLayout时,如何制作一个片段来占用屏幕的自由空间?

  •  -1
  • HelloCW  · 技术社区  · 6 年前

    在新的设计库中,有几个新的布局,如果开发人员愿意的话,这些布局可以极大地改变工具栏的行为方式。由于不同的片段具有不同的行为和目标,例如一个带有折叠工具栏的库片段显示一张重要的照片,或者一个没有滚动视图的片段不需要appbarlayout来隐藏工具栏,因此在活动中使用单个工具栏可能会很困难。

    0 回复  |  直到 11 年前
        1
  •  57
  •   Клаус Шварц    10 年前

    对我来说,在每个片段中都有appbar和toolbar听起来太奇怪了。所以我选择在活动中使用带有工具栏的单个appbar。

    为了解决这个问题与协调布局,你将不得不设置不同的行为,你的团队 FrameLayout

    假设你的默认行为是 app:layout_behavior="@string/appbar_scrolling_view_behavior"

    然后,在fragment\u activity\u layout.xml中,您可能有如下内容:

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/coordinator"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/dashboard_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:theme="@style/AppTheme.Toolbar"
                app:layout_scrollFlags="scroll|enterAlways"/>
        </android.support.design.widget.AppBarLayout>
    
        <FrameLayout
            android:id="@+id/dashboard_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
    </android.support.design.widget.CoordinatorLayout>
    

    在每一个你不想实现的片段中 你必须重写 onAttach onDetach 改变你的行为的方法

    CoordinatorLayout.Behavior behavior;
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    
        if(behavior != null)
            return;
    
        FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();
    
        behavior = params.getBehavior();
        params.setBehavior(null);
    
    }
    
    @Override
    public void onDetach() {
        super.onDetach();
        if(behavior == null)
            return;
    
        FrameLayout layout =(FrameLayout) getActivity().findViewById(R.id.dashboard_content);
        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();
    
        params.setBehavior(behavior);
    
        layout.setLayoutParams(params);
    
        behavior = null;
    }
    

    之后,CoordinatorLayout将不会崩溃appbar等,并将允许碎片布局是全高。

        2
  •  8
  •   Charles-Eugene Loubao    10 年前

    这是我的解决办法

    <!-- Put your fragment inside a Framelayout and set the behavior for this FrameLayout -->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
        <!-- Your fragment -->
        <include layout="@layout/content_main" />
    
    </FrameLayout>
    
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
    
    </android.support.design.widget.AppBarLayout>
    

        3
  •  1
  •   Community Mohan Dere    6 年前

    这是一个非常好的问题:应该吗 Toolbar ActionBar 被关在一个房间里 Activity 或者 Fragment

    案例1:工具栏必须是ActionBar替换

    如果工具栏的行为必须像一个普通的ActionBar(或者如果max1片段不时显示),我认为最好/最简单的方法是使用传统的 Activities 有自己的工具栏,把你的片段放在那里。这样您就不必担心什么时候必须显示哪个工具栏。

    从片段中更改ActionBar(-behavior)也是可能的,但我不建议这样做,因为这会迫使您跟踪哪个片段更改了ActionBar。我甚至不知道设置ActionBar是否可以多次完成。

    您还可以选择将不同的独立工具栏放在不同的片段中,并使用它们自己的操作。通过这种方式,你可以将不同的片段显示在彼此的旁边——每个片段在工具栏中都有自己的操作——并建议它是一个工具栏(可能像Gmail应用程序一样,尽管我不确定)。不过,这意味着您必须自己为这些工具栏充气,但这一定不是很困难。

    我希望这将有助于做出选择。

        4
  •  1
  •   Valeriy Katkov    5 年前

    导航就是这样 documentation says

    当应用程序中每个目的地的应用程序栏布局相似时,将顶部应用程序栏添加到活动中效果很好。但是,如果您的顶级应用程序栏在目的地之间发生了很大变化,那么考虑从您的活动中删除顶部应用程序条,并在每个目的片段中定义它。

    实际上,设置一个 Toolbar 使用 NavigationUI ,并且此解决方案不需要片段了解其父级。例如:

    <!-- my_fragment.xml -->
    <androidx.constraintlayout.widget.ConstraintLayout ...>
    
      <com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        ... />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    
    class MyFragment : Fragment() {
      ...
    
      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    
        val navController = findNavController()
        binding.toolbar.setupWithNavController(navController)
      }
    }
    

    here . 还有一个相对的问题可能会引起人们的兴趣 Is setSupportActionbar required anymore?