特定片段中的 Snackbar
Posted
技术标签:
【中文标题】特定片段中的 Snackbar【英文标题】:Snackbar in a particular fragment 【发布时间】:2017-02-22 00:30:20 【问题描述】:ViewPager
中有 5 个滑动标签,每个标签都有不同的片段。如果数据加载失败,我想通过 Snackbar 通知用户。它工作正常。
我想要实现的是,如果数据无法加载到特定片段中,我只想在该特定片段中显示Snackbar
。可能吗?
我会详细说明:
考虑一个滑动选项卡布局,其中包含 3 个片段 A、B 和 C。所有 3 个片段都执行一些网络查询并加载数据。如果由于某种原因数据无法加载到片段 A 中,则应无限期地显示一个快餐栏。如果用户滑动到片段 B(其中数据加载成功),snackbar 应该是不可见的。
因此,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_
android:layout_
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_
android:layout_>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<LinearLayout
android:id="@+id/date_layout"
android:visibility="gone"
android:layout_gravity="center_horizontal"
android:orientation="horizontal"
android:layout_
android:layout_>
<android.support.v7.widget.AppCompatSpinner
android:id="@+id/country_select"
style="@style/Base.Widget.AppCompat.Spinner.Underlined"
android:layout_
android:layout_
android:entries="@array/country"
/>
<android.support.v7.widget.AppCompatSpinner
android:id="@+id/month_select"
style="@style/Base.Widget.AppCompat.Spinner.Underlined"
android:layout_
android:layout_
android:entries="@array/month"
/>
<android.support.v7.widget.AppCompatSpinner
android:id="@+id/year_select"
style="@style/Base.Widget.AppCompat.Spinner.Underlined"
android:layout_
android:layout_
android:entries="@array/year"
/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/latest_recyclerview"
android:layout_
android:layout_ />
</LinearLayout>
</android.support.v4.widget.SwipeRefreshLayout>
<LinearLayout
android:layout_
android:layout_
android:gravity="center">
<TextView
android:id="@+id/not_available"
android:layout_
android:layout_
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);
【问题讨论】:
我只想在该特定片段中显示一个快餐栏。有可能吗? 你这是什么意思?您的意思是当该片段可见时仅显示 snakcbar ? @NJ 我已经更新了帖子,提供了更多细节。请看那个。 同时显示来自片段的snackbar pass view,所以当视图变得不可见时,sanckbar会自动变得不可见 我试过了,但它似乎不起作用。小吃吧在其他片段中仍然可见。只是让您知道,所有 3 个片段都是同一片段的新实例,即 MainFragment 根据传递给它的值执行一些不同的查询。 请将您的代码发布在您目前所做的工作上。如果这是您所要求的,则可以在处理片段的活动中处理快餐栏的可见性。 【参考方案1】:你可以做的是覆盖setUserVisibleHint
并将snakbar存储在片段中的全局变量中,当片段变得不可见时,使用下面的方法关闭snakbar
@Override
public void setUserVisibleHint(boolean visible)
super.setUserVisibleHint(visible);
if (!visible && snackbar != null )
snackbar.dismiss()
【讨论】:
成功了!我现在可以耐心地去上大学了,谢谢。 :)以上是关于特定片段中的 Snackbar的主要内容,如果未能解决你的问题,请参考以下文章