Закусочная с координаторомLayout отключить увольнение

Я пользуюсь поддержкой

  • FloatingActionButton
  • Закусочная
  • CoordinatorLayout

Мне нужен координаторLayout, так что если SnackBar показан, FloatingActionButton движется вверх, чтобы освободить место для закуски. Для лучшего понимания проверьте это видео .

Я использую SnackBar для двойного возврата для выхода из приложения, но SnackBar можно уволить.

Есть ли способ отключить увольнение на SnackBar?

Snackbar snackbar = Snackbar.make(view, R.string.press_back_again_to_exit, Snackbar.LENGTH_SHORT); snackbar.setAction(R.string.ok, new View.OnClickListener() { @Override public void onClick(View v) { } }); snackbar.setActionTextColor(getResources().getColor(R.color.white)); View view = snackbar.getView(); view.setBackgroundColor(getResources().getColor(R.color.orange_warning)); snackbar.show(); 

раскладка

 <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" xmlns:sothree="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:fitsSystemWindows="true"> <com.sothree.slidinguppanel.SlidingUpPanelLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom" sothree:umanoFadeColor="@android:color/transparent" sothree:umanoPanelHeight="100dp" sothree:umanoShadowHeight="4dp"> <!-- Toolbar and main content --> <LinearLayout android:id="@+id/toolbar_and_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <include layout="@layout/toolbar"/> <!-- Your content layout --> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"/> </LinearLayout> <!-- Sliding up panel layout --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/darker_grey" android:orientation="vertical"> ... </LinearLayout> </com.sothree.slidinguppanel.SlidingUpPanelLayout> <!-- Navigation drawer --> <ExpandableListView android:id="@+id/lv_left_drawer" android:layout_width="280dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="@color/white" android:childDivider="@android:color/transparent" android:clickable="true" android:divider="@color/divider_color" android:dividerHeight="0.6dp" android:fadeScrollbars="true" android:groupIndicator="@null" android:listSelector="@drawable/button_drawer_child_selector" android:scrollbarSize="0dp"/> </android.support.v4.widget.DrawerLayout> <android.support.design.widget.FloatingActionButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|bottom" android:layout_marginBottom="@dimen/floating_action_button_margin" android:layout_marginRight="@dimen/floating_action_button_margin" android:src="@drawable/ic_add" android:visibility="invisible" app:backgroundTint="@color/orange" app:borderWidth="0dp" app:elevation="6dp" app:fabSize="normal"/> </android.support.design.widget.CoordinatorLayout> 

PS

Я знаю об этой библиотеке GitHub , которая имеет эту функциональность, но есть ли «родной» способ сделать это?

Вы можете изменить продолжительность показа Snackbar. Он будет аналогичен отключению.

 int LENGTH_INDEFINITE Show the Snackbar indefinitely. 

Проверьте документы .

Если это не работает. Для этого существует только один способ: «Внедрите свой собственный« Закусочный »и переопределите метод« Отклонить » dismiss() и в этом ничего не сделайте. 🙂 Поскольку dismiss() является общедоступным API.

Ответ на использование LENGTH_INDEFINITE недостаточен.

Он не подлежит уклонению, когда Snackbar не является ребенком CoordinatorLayout . Когда это ребенок, вы все равно можете отмахнуться от SnackBar.

То, что вы можете сделать в этом случае, – это прослушивание прокрутки и просто повторное шоу Snackbar.

 public void showAnnoyingSnackBar(View root, String text) { Snackbar.make(root, text, Snackbar.LENGTH_INDEFINITE) .setCallback(new Snackbar.Callback() { @Override public void onDismissed(Snackbar snackbar, int event) { // recursively call this method again when the snackbar was dismissed through a swipe if (event == DISMISS_EVENT_SWIPE) showAnnoyingSnackBar(root, text); } }) .show(); } 

Я заметил, что когда вызывается метод show (), SnackbarLayout еще не полностью инициализирован.

Чтобы заблокировать dissmiss, мы должны очистить поведение после инициализации SnackbarLayout . Лучшее место для этого – например, в OnPreDrawListener из SnackbarLayout

 final Snackbar snack = Snackbar.make(getView(), "I can't be dissmiss", Snackbar.LENGTH_INDEFINITE); snack.show(); snack.getView().getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { snack.getView().getViewTreeObserver().removeOnPreDrawListener(this); ((CoordinatorLayout.LayoutParams) snack.getView().getLayoutParams()).setBehavior(null); return true; } }); 

Мне удалось отключить snackbars swipe-side-to-reject со следующим хаком (после вызова snackbar.show ())

 ((android.support.design.widget.CoordinatorLayout.LayoutParams) snackbar.getView().getLayoutParams()).setBehavior(null);