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

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

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

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

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

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


person Marcel Bro    schedule 08.04.2016    source источник
comment
это то, что я сделал для своего проекта.   -  person gmetax    schedule 10.11.2017


Ответы (3)


Это варианты, которые у вас есть. Используйте один из них, как вам нужно в проекте.

Лучший способ

Лучший способ сделать это - это то, что вы уже сказали в своем вопросе, добавить BaseActivity и распространить на него все свои действия. Согласно официальной документации от CoordinatorLayout,

CoordinatorLayout предназначен для двух основных вариантов использования:

  1. Как декор приложения верхнего уровня или хром-макет
  2. Как контейнер для определенного взаимодействия с одним или несколькими дочерними представлениями

Итак, 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);
person Rahat Zaman    schedule 17.11.2017

Я реализовал то же самое, что и 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 внизу.

person Samir Bhatt    schedule 17.11.2017
comment
Это не помогает в ситуации CoordinatorLayout. Я вообще не о том спрашивал! - person Marcel Bro; 17.11.2017
comment
@anoniim Хорошо, ваши вопросы: Есть ли лучший способ? и я думаю, что этот ответ завершает ответ Рахата. - person JJ86; 17.11.2017
comment
Да, есть ли лучший способ использовать CoordinatorLayout?. Без него закусочные нельзя смахивать и они плохо сочетаются с другими элементами макета. - person Marcel Bro; 17.11.2017
comment
это то что мне нужно +1 - person Tejas Pandya; 13.03.2019

Да, вы можете превратить свой макет в макет координатора, например

<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>
person Gunners.Ranju    schedule 17.11.2017