2017-06-09 3 views
1

Ich versuche, eine Aktivität zu starten, wenn eine bestimmte Registerkarte ausgewählt ist, aber wenn ich von dieser Aktivität zurückkomme, möchte ich die vorherige anstelle der Registerkarte anzeigen, auf die ich geklickt habe. Genau wie wenn Sie auf Instagram auf den Plus-Button klicken.ViewPager - Startaktivität von setOnTabSelectedListener

So:

  • Standard Fragment 1/Tab 1

  • Zum Fragment 5/Tab 5

  • Klicken Sie auf Registerkarte 3, Aktivität erscheint

  • Go zurück, siehe Fragment 5/Tab. 5

Momentan speichere ich den zuletzt besuchten Tab-Index in einer Variablen. Wenn Tab 3 angeklickt wird, wird der zuletzt besuchte Tab angezeigt.

tabLayout.setOnTabSelectedListener(
      new TabLayout.ViewPagerOnTabSelectedListener(viewPager) { 
       @Override 
       public void onTabSelected(TabLayout.Tab tab) { 
        //super.onTabSelected(tab); -- Should keep this or leave it commented out? 
        int pos = tab.getPosition(); 
        switch (pos) { 
         case 0: 
          viewPager.setCurrentItem(tab.getPosition(), false); 
          getSupportActionBar().setTitle("Home"); 
          pre_pos = pos; 
          pre_title = "Home"; 
          break; 
         case 1: 
          viewPager.setCurrentItem(tab.getPosition(), false); 
          getSupportActionBar().setTitle("Trending"); 
          pre_pos = pos; 
          pre_title = "Trending"; 
          break; 
         case 2: 
          viewPager.setCurrentItem(pre_pos, false); 
          getSupportActionBar().setTitle(pre_title); 

          Intent intent = new Intent(MainActivity.this, NewEvent_Activity.class); 
          startActivity(intent); 
          Toast.makeText(getApplicationContext(), 
            "Curr: "+ viewPager.getCurrentItem()+ 
            " Prev: " + pre_pos + 
            " Clicked: " +tab.getPosition(), 
            Toast.LENGTH_SHORT).show(); 
          break; 
         case 3: 
          viewPager.setCurrentItem(tab.getPosition(), false); 
          getSupportActionBar().setTitle("Notifications"); 
          pre_pos = pos; 
          pre_title = "Notifications"; 
          break; 
         case 4: 
          viewPager.setCurrentItem(tab.getPosition(), false); 
          getSupportActionBar().setTitle("Profile"); 
          pre_pos = pos; 
          pre_title = "Profile"; 
          break; 
        } 
       } 
      }); 

In ViwPager.java nennt es diese Funktion, wenn setCurrentItem()

void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) { 
    if (mAdapter == null || mAdapter.getCount() <= 0) { 
     setScrollingCacheEnabled(false); 
     return; 
    } 
    //I think my problem lies in the following line (mCurItem == item) 
    if (!always && mCurItem == item && mItems.size() != 0) { 
     setScrollingCacheEnabled(false); 
     return; 
    } 

    if (item < 0) { 
     item = 0; 
    } else if (item >= mAdapter.getCount()) { 
     item = mAdapter.getCount() - 1; 
    } 
    final int pageLimit = mOffscreenPageLimit; 
    if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) { 
     // We are doing a jump by more than one page. To avoid 
     // glitches, we want to keep all current pages in the view 
     // until the scroll ends. 
     for (int i = 0; i < mItems.size(); i++) { 
      mItems.get(i).scrolling = true; 
     } 
    } 
    final boolean dispatchSelected = mCurItem != item; 

    if (mFirstLayout) { 
     // We don't have any idea how big we are yet and shouldn't have any pages either. 
     // Just set things up and let the pending layout handle things. 
     mCurItem = item; 
     if (dispatchSelected) { 
      dispatchOnPageSelected(item); 
     } 
     requestLayout(); 
    } else { 
     populate(item); 
     scrollToItem(item, smoothScroll, velocity, dispatchSelected); 
    } 
} 

genannt wird, ich denke, das ist, wo mein Problem ist, aber ich kann es nicht ändern kann. Irgendwelche Vorschläge?

Danke.

Antwort

1

implementieren Sie ViewPager.OnPageChangeListener für Aktivität. set listner auf viewpager

view_pager.setOnPageChangeListener(this); 

in OnPageSelected() -Methode:

@Override 
public void onPageSelected(int position) { 
    if (position == 3) { 
     startActivity(new Intent(this,activity.class)); 
    } 
} 

Überschreibung Aktivität onResume Methode und schreiben:

@Override 
public void onResume() { 
    super.onResume(); 
    view_pager.setCurrentItem(0); 
} 
+0

onResume() wird auch aufgerufen, wenn Sie Ihre Aktivität zum ersten Mal starten, wird der zuletzt gespeicherte Index standardmäßig angezeigt. –

0

Um dies zu tun Sie diese einfachen Schritte folgen müssen

Schritt: 1 Aufschalten unter Methode in allen ViewPager Frgment

@Override 
    public void setMenuVisibility(boolean menuVisible) { 
     super.setMenuVisibility(menuVisible); 
    } 

diese Methode wird aufgerufen, wenn Ihr Fragment sichtbar werden.

Schritt: 2 einen Zustand, in Fragmenr3 Setzen neue Aktivität zu starten, wenn Ihr Fragment sichtbar werden

@Override 
     public void setMenuVisibility(boolean menuVisible) { 
      super.setMenuVisibility(menuVisible); 
      if(menuVisible){ 
Intent intent = new Intent(MainActivity.this, NewEvent_Activity.class); 
          startActivity(intent); 
      } 
     } 

Jetzt wird es Ihnen Aktivität vor öffnen. aber Ihre einzige Anforderung bleibt, das ist, wenn der Benutzer von der Aktivität zurückdrückt, müssen Sie das zweite letzte Fragment anzeigen, so wie Sie erwähnt haben, dass Sie die Indexposition des letzten Fragments speichern, so folgen Sie unten Schritt.

Schritt: 3 Aufschalten onRestart() in Ihrem ViewPager actvity

@Override 
    protected void onRestart() { 
     super.onRestart(); 
     view_pager.setCurrentItem(Stored last Index); 
    } 

es Ihr Problem zu lösen, sein für mich arbeiten.

Verwandte Themen