Является ли хорошей практикой обертывание всех макетов в CoordinatorLayout?
Я думаю о способе реализации Android Snackbars в моем приложении. В принципе, я хочу показать Snackbar из любого места приложения.
Как я узнал, android.support.design.widget.Snackbar
выполняет лучшее, когда ставится в android.support.design.widget.CoordinatorLayout
. В противном случае, я не могу пронести его, он отображается в навигационном ящике и не взаимодействует с плавающей кнопкой Action.
Итак, вопрос: хорошая ли практика переносить все мои макеты в CoordinatorLayout
, получить ссылку для нее в BaseActivity, чтобы она могла быть передана в Snackbar практически из любого места?
Это похоже на надежный способ убедиться, что Snackbar и другие компоненты компоновки ведут себя корректно, но... ну, значит, касаются всех макетов и имеют один BaseActivity, который расширяется всеми другими действиями и к которым можно получить доступ из любого фрагмента желая показать закусочную.
Есть ли лучший способ?
Ответы
Ответ 1
Это параметры, которые у вас есть. Используйте один из них, как вам нужно в проекте.
Лучший способ
Лучший способ сделать это - это то, что вы уже сказали в своем вопросе, добавить BaseActivity
и расширить все свои действия от него. Согласно официальной документации CoordinatorLayout
,
CoordinatorLayout
предназначен для двух основных случаев использования:
- Как декор приложения верхнего уровня или хром-макет
- В качестве контейнера для конкретного взаимодействия с одним или несколькими дочерними представлениями
Итак, CoordinatorLayout
создается именно по этой причине (хотя есть и другие причины). В документации будет меньше проблем с производительностью.
Используя FrameLayout
Как уже ответил 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>
Затем вы будете использовать только одно действие с 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);
Ответ 2
Я реализовал то же самое, что и open 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
снизу каждый раз.
Ответ 3
Да, вы можете обернуть свой макет в макет координатора, например
<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>