在CoordinatorLayout中包装所有布局是一个好习惯吗?

时间:2016-04-08 17:33:59

标签: android android-coordinatorlayout android-snackbar coordinator-layout snackbar

我想到了在我的应用中实现Android Snackbars的方法。基本上,我希望能够在应用程序的任何位置显示Snackbar。

我发现NULL在放入android.support.design.widget.Snackbar时效果最佳。否则,我无法将其滑开,它显示在导航抽屉上,并且不会与浮动操作按钮进行交互。

所以问题是:在android.support.design.widget.CoordinatorLayout包装所有布局是一个好习惯,在BaseActivity中获取它的引用,以便它可以传递给Snackbar几乎在哪里?

这似乎是确保Snackbar和其他布局组件正常运行的可靠方法,但是......好吧,意味着触摸所有布局并拥有一个BaseActivity,该BaseActivity由所有其他活动扩展,并且可以从任何片段访问想要展示Snackbar。

有更好的方法吗?

3 个答案:

答案 0 :(得分:9)

我已经在应用程序的任何位置实现了与开放Snackbar相同的内容。

我创建了一个常用方法,只需传递我需要显示的上下文和字符串消息,无需传递任何视图。看看我的代码片段。

 public static void showSnackBar(Activity context, String msg) {
   Snackbar.make(context.getWindow().getDecorView().findViewById(android.R.id.content), msg, Snackbar.LENGTH_LONG).show();
 }

使用此功能,您每次都会将Snackbar放在最底层。

答案 1 :(得分:2)

这些是您的选择。在项目中根据需要使用其中一个。

最好的方式

执行此操作的最佳方式是您在问题中已经说过的内容,添加BaseActivity并从中扩展您的所有活动。根据{{​​1}}的{​​{3}},

  

CoordinatorLayout适用于两个主要用例:

     
      
  1. 作为顶级应用程序装饰或镀铬布局
  2.   
  3. 作为与一个或多个子视图进行特定交互的容器
  4.   

因此CoordinatorLayout创建主要是出于这个原因(尽管还有official documentation个原因)。文档中提到的性能问题最少。

使用FrameLayout

正如Rainmaker已经回答的那样,你可以使用一个活动,在你的布局文件夹中引用CoordinatorLayout布局,其中孩子将成为一个framelayout。

CoordinatorLayout

然后,您将只使用<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout android:id="@+id/activity_root" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.design.widget.CoordinatorLayout> 的一项活动。然后,您将所有其他活动转换为片段,并添加:

setContentView(R.layout.root_coordinate_layout)

编程方式

这是做同样事情的另一种方式。但这有点复杂,需要做很多工作。

在您的所有活动中,请使用以下内容代替MyFragment myf = new MyFragment(); FragmentTransaction transaction = getFragmentManager() .beginTransaction() .add(R.id.your_layout, myf) .commit();

setContentView(R.id.your_layout)

答案 2 :(得分:1)

是的,您可以将布局包装到协调器布局中,例如

<android.support.design.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"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <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/ThemeOverlay.AppCompat.Light" />
    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <Button
            android:id="@+id/btnSimpleSnackbar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:text="Simple Snackbar" />

        <Button
            android:id="@+id/btnActionCallback"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="With Action Callback" />

        <Button
            android:id="@+id/btnCustomSnackbar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="Custom Color" />

    </LinearLayout>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:layout_margin="16dp"
        android:src="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>