Панель закусок в определенном фрагменте

#android #android-design-library #snackbar

#Android #android-дизайн-библиотека #панель закусок

Вопрос:

У меня есть 5 скользящих вкладок в a ViewPager , каждая из которых содержит отдельный фрагмент. Если данные не загружаются, я хочу уведомить пользователя через Snackbar. Все работает нормально.

Чего я пытаюсь добиться, так это того, что если данные не загружаются в определенном фрагменте, я хочу показать a Snackbar только в этом конкретном фрагменте. Возможно ли это?

Я уточню:

Рассмотрим макет скользящей вкладки с 3 фрагментами как A, B и C. Все 3 фрагмента выполняют некоторый сетевой запрос и загружают данные. Если по какой-либо причине данные не загружаются во фрагменте A, панель закусок должна отображаться бесконечно. И если пользователь переходит к фрагменту B (в котором данные загружены успешно), snackbar не должен быть виден.

Таким образом, панель закусок должна быть видна только во фрагменте, который не смог загрузить данные.

Фрагмент кода:

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@ id/fragment_latest"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/windowBackground"
tools:context=".MainFragment">

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:id="@ id/date_layout"
            android:visibility="gone"
            android:layout_gravity="center_horizontal"
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <android.support.v7.widget.AppCompatSpinner
                android:id="@ id/country_select"
                style="@style/Base.Widget.AppCompat.Spinner.Underlined"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:entries="@array/country"
                />

            <android.support.v7.widget.AppCompatSpinner
                android:id="@ id/month_select"
                style="@style/Base.Widget.AppCompat.Spinner.Underlined"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:entries="@array/month"
                />

            <android.support.v7.widget.AppCompatSpinner
                android:id="@ id/year_select"
                style="@style/Base.Widget.AppCompat.Spinner.Underlined"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:entries="@array/year"
                />

        </LinearLayout>

        <android.support.v7.widget.RecyclerView
            android:id="@ id/latest_recyclerview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>

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

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

    <TextView
        android:id="@ id/not_available"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-medium"
        android:gravity="center"
        android:textSize="16sp" />

</LinearLayout>
  

Код панели закусок:

 if (Utils.isNetworkAvailable(getActivity())) {
        adapter.notifyDataSetChanged();
        loadData();
    } else {
        swipeRefreshLayout.setRefreshing(false);
        textView.setText(getString(R.string.check_internet));
        Snackbar.make(frameLayout, "Loading failed.", Snackbar.LENGTH_INDEFINITE).setAction("Retry", new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ((MainActivity) getActivity()).loadAds();
                refreshData();
            }
        }).show();
    }
  

где

 FrameLayout frameLayout = (FrameLayout) v.findViewById(R.id.fragment_latest);
  

Комментарии:

1. Я хочу показать панель закусок только в этом конкретном фрагменте. Возможно ли это? что вы имеете в виду под этим? Вы имеете в виду, когда этот фрагмент виден, тогда отображается только snakcbar?

2. @NJ Я обновил сообщение с некоторыми подробностями. Пожалуйста, посмотрите на это.

3. при отображении snackbar просмотр передачи из фрагмента, поэтому, когда view становится невидимым, sanckbar автоматически становится невидимым

4. Я пробовал это, но, похоже, это не работает. Панель закусок по-прежнему видна и в других фрагментах. Просто чтобы вы знали, все 3 фрагмента являются новыми экземплярами одного и того же фрагмента, т.Е. MainFragment , выполняющего какой-то другой запрос на основе переданного ему значения.

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

Ответ №1:

Что вы можете сделать, это переопределить setUserVisibleHint и сохранить snakbar в глобальной переменной во фрагменте, когда фрагмент станет невидимым, отключите snackbar, используя метод ниже

 @Override
public void setUserVisibleHint(boolean visible)
{
    super.setUserVisibleHint(visible);
    if (!visible amp;amp; snackbar != null ){
       snackbar.dismiss()
    }
}
  

Комментарии:

1. Это сработало! Теперь я могу терпеливо уехать в колледж, спасибо. 🙂