我想到了在我的应用中实现Android Snackbars的方法。基本上,我希望能够在应用程序的任何位置显示Snackbar。
我发现NULL
在放入android.support.design.widget.Snackbar
时效果最佳。否则,我无法将其滑开,它显示在导航抽屉上,并且不会与浮动操作按钮进行交互。
所以问题是:在android.support.design.widget.CoordinatorLayout
中包装所有布局是一个好习惯,在BaseActivity中获取它的引用,以便它可以传递给Snackbar几乎在哪里?
这似乎是确保Snackbar和其他布局组件正常运行的可靠方法,但是......好吧,意味着触摸所有布局并拥有一个BaseActivity,该BaseActivity由所有其他活动扩展,并且可以从任何片段访问想要展示Snackbar。
有更好的方法吗?
答案 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
适用于两个主要用例:
- 作为顶级应用程序装饰或镀铬布局
- 作为与一个或多个子视图进行特定交互的容器
醇>
因此CoordinatorLayout
创建主要是出于这个原因(尽管还有official documentation个原因)。文档中提到的性能问题最少。
正如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>