我在ViewPager
中有5个滑动标签,每个标签都有一个不同的片段。如果数据无法加载,我想通过Snackbar通知用户。它工作正常。
我想要实现的是,如果数据无法加载到特定片段中,我只想在该特定片段中显示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>
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();
}
,其中
FrameLayout frameLayout = (FrameLayout) v.findViewById(R.id.fragment_latest);
答案 0 :(得分:5)
你可以做的是覆盖setUserVisibleHint
并在片段变为不可见时将snakbar存储在片段中的全局变量中使用以下方法关闭快餐栏
@Override
public void setUserVisibleHint(boolean visible)
{
super.setUserVisibleHint(visible);
if (!visible && snackbar != null ){
snackbar.dismiss()
}
}