特定片段中的 Snackbar

Snackbar in a particular fragment

我在 ViewPager 中有 5 个滑动标签,每个标签都有不同的片段。如果数据加载失败,我想通过 Snackbar 通知用户。一切正常。

我想要实现的是,如果数据无法加载到特定片段中,我只想在该特定片段中显示 Snackbar。可能吗?

I'll elaborate:

考虑一个包含 3 个片段的滑动选项卡布局,如 A、B 和 C。所有 3 个片段都执行一些网络查询并加载数据。如果由于某种原因数据无法加载到片段 A 中,则应无限期地显示一个 snackbar。如果用户滑动到片段 B(其中数据已成功加载),则不应显示 snackbar。

所以 snackbar 应该只在加载数据失败的片段中可见。

Fragment Code:

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

Snackbar Code:

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();
    }

where

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

你可以做的是覆盖 setUserVisibleHint 并在片段变得不可见时将 snackbar 存储在片段的全局变量中,使用以下方法关闭 snackbar

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