2016-10-13 1 views
4

J'ai 5 onglets coulissants dans un ViewPager, chacun contenant un fragment différent. Si les données ne parviennent pas à charger, je veux informer l'utilisateur via Snackbar. Ça fonctionne bien. Ce que j'essaye de réaliser est, si les données ne chargent pas dans un fragment particulier, je veux montrer un Snackbar seulement dans ce fragment particulier. C'est possible?Snackbar dans un fragment particulier

Je vais élaborer:

Tenir compte d'une mise en page d'onglet coulissant avec 3 fragments A, B, C. & Tous les 3 fragments effectuer une requête de réseau et de charger les données. Si, pour une raison quelconque, les données ne parviennent pas à charger dans le fragment A, un casse-croûte devrait être affiché indéfiniment. Et si l'utilisateur glisse vers le fragment B (dans lequel les données ont été chargées avec succès), le snackbar ne devrait pas être visible. Par conséquent, le snackbar ne doit être visible que dans le fragment qui n'a pas pu charger les données.

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

Code du Snack-bar:

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

** Je veux montrer un snack-bar dans ce fragment particulier seulement. Est-ce possible? ** Qu'entendez-vous par là? Vous voulez dire quand ce fragment est visible, alors seulement afficher snakcbar? –

+0

@NJ J'ai mis à jour le post avec plus de détails. S'il vous plaît voir ça. – hemantv

+0

tout en montrant la vue de passage de snackbar du fragment ainsi quand la vue devient invisible alors sanckbar deviennent automatiquement invisibles –

Répondre

5

Qu'est-ce que vous pouvez faire est remplacer setUserVisibleHint et snakbar stocker dans la variable globale dans le fragment quand fragment devient invisible rejeter le snackbar en utilisant ci-dessous la méthode

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

Ça a marché! Je peux maintenant partir pour l'université patiemment, merci. :) – hemantv

+0

@hemantv bienvenue, heureux de vous aider :) –