2016-08-15 3 views
1

Ich habe eine TabLayout mit drei Fragmenten, auf der ersten Registerkarte möchte ich zwischen zwei Fragmenten je nach Bedingung wechseln, ich habe if Anweisung verwendet, aber die Fragmente wechseln nicht, sie behalten nur ihre Anfangsfragment. Das Folgende ist das Fall-Szenario und ein Code-Snippet von dem, was gerade passiert.Reload Aktivität um zwischen den Fragmenten umzuschalten

MY App können Benutzer entscheiden, ob sie bei der ersten Verwendung zu melden sind oder nicht, und meine Haupttätigkeit ist die Trägerrakete, die Haupttätigkeit des Adapters überprüft (a TabLayout und drei Fragment enthält), wenn der Benutzer angemeldet ist oder nicht .

if (user != login) { 
    load fragment A 
}else{ 
    load fragment B 
} 

ich eine Option irgendwo, wo Benutzer anmelden können, während der App verwenden, , wenn der Benutzer auf Login-Button klickt, lädt es ein Bruchstück für Benutzer anmelden, sobald der Benutzer angemeldet ist, noch das Fragment behalten Der Status des Benutzers ist nicht eingeloggt, dh es lädt immer noch Fragment A, aber dann kann ich alle Benutzer-Login-Details in der App sehen.

dieser Punkt ist noch aktiv

if (user != login) { 
    load fragment A 
} 

Code Snippet

@Override 
public Fragment getItem(int position) { 
    Fragment f; 
    switch (position) { 
     case NEWS_POST: 
      if(fbid != null){ 
       f = new NewsFragment(); 
      }else{ 
       f = new NewsAllFragment(); 
      } 
+0

bitte mehr Details liefern, Ihr Problem ist unvollständig –

+0

ein bisschen mehr Code hinzufügen, den Teil, wo Sie verwenden 'FragmentManager' zu' hinzufügen/replace' die aktuellen erstreckt 'Fragment'. Fügen Sie außerdem Haltepunkte hinzu, an denen Sie 'NewsFragment' und' NewsAllFragment' initialisieren, um zu überprüfen, ob sie tatsächlich aufgerufen werden. – Abbas

+0

Sie sollten einen eingeloggten boolean oder einen Schlüssel in Ihrer Präferenz speichern, um zu überprüfen, ob Sie wissen wollen, ob der Benutzer sich eingeloggt hat oder nicht – Eenvincible

Antwort

0

Zuerst sollten Sie SharedPreferences verwenden Benutzer zu überprüfen, angemeldet ist oder nicht.

Darüber hinaus können Sie diesen Code in Ihren Fragmenten verwenden, um zu überprüfen, ob dieses Fragment sichtbar ist oder nicht. und wenn sichtbar, können Sie Ihre erforderliche Aufgabe erledigen boolean eingeloggten Informationen von gemeinsamen Voreinstellungen.

private static boolean m_iAmVisible; 

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    m_iAmVisible = isVisibleToUser; 

    if (m_iAmVisible) { 
     Log.d(localTAG, "this fragment is now visible"); 
    } else { 
     Log.d(localTAG, "this fragment is now invisible"); 
    } 
} 

Hier sehe ich ein Fragment haben, in denen ich viewPager verwende, in onCreateView Methode

final View x = inflater.inflate(R.layout.consumer_tab_layout, null); 
     tabLayout = (TabLayout) x.findViewById(R.id.tabs); 
     viewpager_for_tabs = (ViewPager) x.findViewById(R.id.viewpager_for_tabs); 


     bottom_tv1 = (TextView) x.findViewById(R.id.bottom_tv1); 
     bottom_tv2 = (TextView) x.findViewById(R.id.bottom_tv2); 
     bottom_tv3 = (TextView) x.findViewById(R.id.bottom_tv3); 
     bottom_tv4 = (TextView) x.findViewById(R.id.bottom_tv4); 
     bottom_tv5 = (TextView) x.findViewById(R.id.bottom_tv5); 

     /** 
     *Set an Apater for the View Pager 
     */ 
     viewpager_for_tabs.setAdapter(new MyAdapter(getChildFragmentManager())); 
     viewpager_for_tabs.setOffscreenPageLimit(5); 

     /** 
     * Now , this is a workaround , 
     * The setupWithViewPager dose't works without the runnable . 
     * Maybe a Support Library Bug . 
     */ 

     viewpager_for_tabs.setOnPageChangeListener(myOnPageChangeListener); 
     bottom_tv1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv1, R.drawable.d1); 
       viewpager_for_tabs.setCurrentItem(0, false); 
      } 
     }); 
     bottom_tv2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv2, R.drawable.d2); 
       viewpager_for_tabs.setCurrentItem(1, false); 
      } 
     }); 
     bottom_tv3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv3, R.drawable.d3); 
       viewpager_for_tabs.setCurrentItem(2, false); 
      } 
     }); 
     bottom_tv4.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv4, R.drawable.d4); 
       viewpager_for_tabs.setCurrentItem(3, false); 
      } 
     }); 
     bottom_tv5.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv5, R.drawable.d5); 
       viewpager_for_tabs.setCurrentItem(4, false); 
      } 
     }); 

     tabLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       tabLayout.setupWithViewPager(viewpager_for_tabs); 


      } 
     }); 

     return x; 

Und Adapter getitem Methoden

@Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
         return new fragment(); 

       case 1: 
        return frag2.getInstance(); 
       case 2: 
        return frag3.getInstance(); 
       case 3: 
        return frag4.getInstance(); 
       case 4: 
        return frag5.getInstance(); 
      } 
      return null; 
     } 

Dabei war ich habe nur pragmatisch Rufen Sie Button onClick mit performClick() -Methode für Ansichten auf und es wird automatisch mein Fragment ersetzen.

bessere Lösung wäre es, aktuelle Artikel von viewPager einen Blick auf diese Lösung haben sich ändern pager.setCurrentItem(num)

Wenn Sie verschiedene Fragmente auf einer einzigen Registerkarte viewPager dann gelten Boolesche Bedingung in getItems() -Methode des Fragments zeigen wollen Adapter. Rufen Sie dann viewPager.setCurrentItem(int) Funktion an.

Achten Sie darauf, Ihr Fragment Adapter FragmentStatePagerAdapter Klasse

+0

Ich bekomme, wenn Benutzer angemeldet ist oder nicht von geteilten Präferenzen, es funktioniert gut, wenn ich das neu lade App, aber während die App immer noch verwendet wird, behält sie ihr ursprüngliches Fragment bei, wenn der Benutzer angemeldet ist, was eine wirklich schlechte Benutzererfahrung ist. – SimpiMind

+0

Es muss Code vorhanden sein, der prüft, ob der Benutzer angemeldet ist und eine Aufgabe ausführt. In diesem Stück Code können Sie Ihr Fragment wie folgt ersetzen http://StackOverflow.com/A/18940937/6634982. Wenn Sie viewpager verwenden, verwenden Sie setPage-Funktion –

+0

Ich habe einen Code, der überprüft, ob Benutzer angemeldet ist, und ich verwende Ansicht Pager mit drei Tabs, ich möchte nur die erste Registerkarte mit einem von zwei verschiedenen Fragment ausstehende auf If ersetzen Der Benutzer ist angemeldet oder nicht. da du schon die idee hast, das thema zu haben, wie kann ich es lösen. Vielen Dank. – SimpiMind

Verwandte Themen