Android: показывает снэк-бар, когда отображается панель инструментов

Это WhatsApp, когда вы не прокручиваете вверх. Панель инструментов показывает и вкладка под ней.

Screenshot1:

whatsapp1

Это WhatsApp, как только вы прокрутите его вверх. Вы можете видеть, что панель инструментов скрыта.

screenshot2:

whatspp2

Существует руководство, чтобы показать вам, как создать этот эффект. Я следил за этим и получил этот эффект для работы в моем приложении.

https://mzgreen.github.io/2015/06/23/How-to-hideshow-Toolbar-when-list-is-scrolling(part3)/

ссылка из гида

Мой вопрос о том, чтобы отобразить снэк-бар, когда у вас есть панель инструментов, как в SCREENSHOT1. Когда я пытаюсь показать снэк-бар, когда панель инструментов отображается, она фактически отображается под экраном, так что она не видна пользователю. Снэк-панель будет видна только в том случае, если пользователь прокручивает и скрывает панель инструментов.

Xml, который я использовал для своего приложения, аналогичен тому, который использовался в руководстве https://github.com/mzgreen/HideOnScrollExample/blob/master/app/src/main/res/layout/activity_part_three.xml. Я скопировал и вставил код по ссылке ниже:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                                 xmlns:app="http://schemas.android.com/apk/res-auto"
                                                 android:id="@+id/coordinatorLayout"
                                                 android:layout_width="match_parent"
                                                 android:layout_height="match_parent">
    <android.support.design.widget.AppBarLayout
            android:id="@+id/appBarLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <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" />

        <android.support.design.widget.TabLayout
                android:id="@+id/tabLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:tabTextColor="@android:color/white"
                app:tabSelectedTextColor="@android:color/white"
                app:tabIndicatorColor="@android:color/white"
                app:tabIndicatorHeight="6dp"/>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    <android.support.design.widget.FloatingActionButton
            android:id="@+id/fabButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end|bottom"
            android:layout_margin="@dimen/fab_margin"
            android:src="@drawable/ic_favorite_outline_white_24dp"
            app:borderWidth="0dp"
            app:layout_behavior="pl.michalz.hideonscrollexample.ScrollingFABBehavior"/>

</android.support.design.widget.CoordinatorLayout>

Кто-нибудь знает, как я могу показать снэк-бар, когда панель инструментов видна?

РЕДАКТИРОВАТЬ:

Поскольку схема компоновки содержит табуляции и каждый из этих таблиц отображает фрагмент, я пытаюсь показать панель для каждого фрагмента, а не на уровне активности. На самом деле я начинаю думать, что это может оказаться невозможным для показа снэк-баров по фрагментам, и это на самом деле нужно сделать, привязав слушателей от каждого из этих трех фрагментов к основному действию, а затем снэб-бар должен просто отобразиться в основная деятельность вместо.

Это xml одного из моих фрагментов:

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/snackbarPosition">

    <android.support.v4.widget.SwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/swipeContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/my_recycler_view"
                android:layout_below="@+id/join"
                android:scrollbars="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
            </android.support.v7.widget.RecyclerView>

    </RelativeLayout>

    </android.support.v4.widget.SwipeRefreshLayout>

</android.support.design.widget.CoordinatorLayout>

3 ответа

Решение

Довольно легко. Просто используйте viewPager как вид и все готово. Это выглядит примерно так:

Snackbar snackbar = Snackbar.make(findViewById(R.id.viewPager), "Your Message", Snackbar.LENGTH_LONG);
    snackbar.getView().setBackgroundColor(Color.parseColor("#00b8ba"));
    snackbar.show();

Убедитесь, что вы передаете findViewById(R.id.viewPager) в качестве представления.

Кстати viewPager определяется как это:

<android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

Для разных фрагментов используйте это (первый фрагмент):

Snackbar snackbar = Snackbar.make(getView(), "First", Snackbar.LENGTH_LONG);
        snackbar.getView().setBackgroundColor(Color.parseColor("#00b8ba"));
        snackbar.show();

второй фрагмент:

Snackbar snackbar = Snackbar.make(getView(), "Second", Snackbar.LENGTH_LONG);
        snackbar.getView().setBackgroundColor(Color.parseColor("#00b8ba"));
        snackbar.show();

Попробуйте установить высоту вашего ViewPager в wrap_content,

CoordinatorLayout должен контролировать свои размеры без использования match_parent,

Кроме того, убедитесь, что вы передаете нисходящее представление вашего CoordinatorLayout Snackbar.make,

Обновление на основе комментариев:

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

Если вы вкладываете CoordinatorLayouts во фрагменты, вам нужно убедиться, что дочерние CoordinatorLayouts не переполняют свои контейнеры, что может быть сложно.

На мой взгляд, было бы проще удалить CoordinatorLayouts из фрагментов и дать Snackbar.make вид из вашего фрагмента вместо. Он с радостью поднимется по иерархии (даже из фрагментов), чтобы достигнуть CoordinatorLayout в вашей деятельности.

Если вы сделаете это, обратные вызовы будут работать как обычно, но не забудьте пометить любые обратные вызовы, которые вы используете как static чтобы не допустить утечки ваших фрагментов в случае, если снэк-бар остается на экране после того, как ваш фрагмент должен исчезнуть.

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

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

Вот что я сделал в коде.

Это мой код активности:

    coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinatorlayout);
    TestFragment testFragment = new Fragment();

    //Needed for every fragment
    testFragment.setActivityCoordinatorLayout(coordinatorLayout); //passed the activity coordinatorlayout to my fragment.

В моем фрагменте мы получаем ссылку на координатор деятельности:

public void setActivityCoordinatorLayout(CoordinatorLayout activityCoordinatorLayout) {
    this.activityCoordinatorLayout = activityCoordinatorLayout;
}

Затем мы устанавливаем снэк-бар, чтобы показать против этого плана действий координатора:

            Snackbar.make(activityCoordinatorLayout, "No internet", Snackbar.LENGTH_LONG)
                    .setAction("Retry", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) { <YOUR CODE>}}).show();

Однако это долгий способ заставить код работать. Более быстрый способ на самом деле использовать код Nilesh и его getView метод.

Другие вопросы по тегам