Подтвердить что ты не робот

Является ли хорошей практикой обертывание всех макетов в CoordinatorLayout?

Я думаю о способе реализации Android Snackbars в моем приложении. В принципе, я хочу показать Snackbar из любого места приложения.

Как я узнал, android.support.design.widget.Snackbar выполняет лучшее, когда ставится в android.support.design.widget.CoordinatorLayout. В противном случае, я не могу пронести его, он отображается в навигационном ящике и не взаимодействует с плавающей кнопкой Action.

Итак, вопрос: хорошая ли практика переносить все мои макеты в CoordinatorLayout, получить ссылку для нее в BaseActivity, чтобы она могла быть передана в Snackbar практически из любого места?

Это похоже на надежный способ убедиться, что Snackbar и другие компоненты компоновки ведут себя корректно, но... ну, значит, касаются всех макетов и имеют один BaseActivity, который расширяется всеми другими действиями и к которым можно получить доступ из любого фрагмента желая показать закусочную.

Есть ли лучший способ?

4b9b3361

Ответ 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>