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

Mar*_*Bro 24 android snackbar android-snackbar coordinator-layout android-coordinatorlayout

我正在考虑在我的应用中实现Android Snackbars的方法.基本上,我希望能够在应用程序的任何位置显示Snackbar.

正如我发现的那样,android.support.design.widget.Snackbar在投入时表现最佳android.support.design.widget.CoordinatorLayout.否则,我无法将其滑开,它显示在导航抽屉上,并且不与浮动操作按钮交互.

所以现在的问题是:这是一个很好的做法,总结我的所有布局CoordinatorLayout,得到的BaseActivity有它的参考,以便它可以从几乎任何地方传递到小吃吧?

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

有没有更好的办法?

Sam*_*att 7

我已经Snackbar在应用程序的任何地方实现了相同的开放.

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

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

使用此功能,您Snackbar每次都可以获得最低价.


Rah*_*man 2

这些是您拥有的选择。根据项目需要使用其中之一。

最好的办法

执行此操作的最佳方法是您在问题中已经说过的内容,添加 aBaseActivity并从中扩展您的所有活动。根据 的官方文档CoordinatorLayout

CoordinatorLayout适用于两个主要用例:

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

所以CoordinatorLayout主要是因为这个原因而创建的(尽管也有其他原因)。正如文档中提到的,性能问题最少。

使用框架布局

正如 Rainmaker 已经回答的那样,您可以使用 Activity 来引用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>
Run Code Online (Sandbox Code Playgroud)

那么您将仅使用一项活动setContentView(R.layout.root_coordinate_layout)。然后,您将把所有其他活动转换为片段并使用以下命令添加它们:

MyFragment myf = new MyFragment();
FragmentTransaction transaction = getFragmentManager()
    .beginTransaction()
    .add(R.id.your_layout, myf)
    .commit();
Run Code Online (Sandbox Code Playgroud)

程序化方式

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

在您的所有活动中,不要使用 ,而是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);
Run Code Online (Sandbox Code Playgroud)