将所有布局封装在CoordinatorLayout中是否是一个好习惯?

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

正如我发现, android.support.design.widget.Snackbar执行最好的时候把android.support.design.widget.CoordinatorLayout 。 否则,我无法将其滑开,它会显示在抽屉上方,并且不会与浮动操作button进行交互。

所以问题是: 将所有我的布局封装CoordinatorLayout是否是一个好习惯,在BaseActivity中获取它的引用,以便它可以从几乎任何地方传递给Snackbar?

这似乎是确保Snackbar和其他布局组件行为正常的一种可靠方法,但是……也就是说,触摸所有布局,并具有一个由所有其他活动扩展的BaseActivity,并且可以从任何想要显示的Fragment一个小吃店。

有没有更好的办法?

Solutions Collecting From Web of "将所有布局封装在CoordinatorLayout中是否是一个好习惯?"

这些是你有的select。 在项目中根据需要使用其中之一。

最好的办法

做这件事的最好方法就是你已经在你的问题中说过了,添加一个BaseActivity并且扩展你所有的活动。 根据CoordinatorLayout的官方文件 ,

CoordinatorLayout用于两个主要的用例:

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

所以CoordinatorLayout的创build主要是出于这个原因(虽然也有其他原因)。 文档中提到的性能问题最less。

通过使用FrameLayout

正如Rainmaker已经回答的那样,您可以使用一个Activity来引用布局文件夹中的CoordinatorLayout布局,其中的孩子将是一个framelayout。

 <?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) ,使用这个:

 LayoutInflater inflater = LayoutInflater.from(this); ConstraintLayout yourLayout = (ConstraintLayout) inflater.inflate(R.layout.your_layout, null, false); CoordinatorLayout layout = new CoordinatorLayout(this); // Set its property as you wish ... layout.addView(mainScreen); setContentView(layout); 

我已经从应用程序的任何地方实现了像打开Snackbar一样的。

我创build了一个通用的方法,只需传递我需要显示的上下文和string消息,而不需要传递任何视图。 看看我的代码片段。

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

使用这个,你会有你的Snackbar在每一次。

是的,你可以把你的布局包装成一个协调器布局,比如

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