2013-08-26 9 views
6

Parçalar arasında geçiş yapmak için bir görüntüleyici kullanıyorum ve geri düğmesinin, etkinliği sonlandırmak yerine önceden görüntülenen parçaya gitmesini istiyorum. Üzgünüz, bu bir this question kopyasıysa, ancak cevabı çok yardımcı bulmuyorum. Açıkçası, BackBackPressed öğesinin geçersiz kılınması gerekiyor, ancak doğru parçayı nasıl alacağımı ve görüntüleyeceğimi bilmiyorum. Fragmentmanager'ın backstack'ını kullanmam gerektiğini varsayalım, fakat getSupportFragmentManager().getBackStackEntryCount() her zaman 0 değerini döndürür. FragmentTransaction.addToBackStack()'u kullanarak arka tarafa parçaları elle eklemem gerekir mi? Eğer öyleyse, bunu adaptörüme nereye eklerim? İşte Vizördeki arka tarafa ve arkadan düğmeyi kullanma

, Etkinliğime kodudur

public class PagerActivity extends FragmentActivity { 

ArrayList<Sale> sales; 
MyAdapter mAdapter; 
ViewPager mPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent it = getIntent(); 
    this.sales = (ArrayList<Sale>) it.getExtras().get("sales"); 
    int position = it.getExtras().getInt("position"); 

    ActionBar actionBar = getActionBar(); 
    actionBar.setDisplayHomeAsUpEnabled(true); 

    setContentView(R.layout.fragment_pager); 
    mAdapter = new MyAdapter(getSupportFragmentManager()); 
    mPager = (ViewPager) findViewById(R.id.pager); 
    mPager.setAdapter(mAdapter); 
    mPager.setCurrentItem(position); 

} 

public class MyAdapter extends FragmentPagerAdapter { 
    public MyAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
    } 

    @Override 
    public int getCount() { 
     return sales.size(); 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     super.destroyItem(container, position, object); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     SalesThumbFragment frag = new SalesThumbFragment(); 
     return frag.newInstance(sales.get(position)); 
    } 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case android.R.id.home: 
     finish(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.sales_controller, menu); 
    return true; 
} 

@Override 
public void onBackPressed() { 
    if(getSupportFragmentManager().getBackStackEntryCount() != 0) { 
    getSupportFragmentManager().popBackStack(); 
    } else { 

    super.onBackPressed(); 
    } 
} 


} 

cevap

0

sen sonra, kullanıcı yeni bir parçasına gider her zaman sonra mPager.getCurrentItem() kullanarak önceki sayfanın endeksi takip etmek için bir alan kullanırsanız onBackPressed() yöntem, sen mPager.setCurrentItem(previousPage)

aramak gerekir Veya, kullanıcı sadece sayfa sırayla, o zaman hiç bir alan gerekmez eğer ve sadece mPager.setCurrentItem(mPager.getCurrentItem()-1)

+0

Kullanıcılar ikinci yönde çalışmayacak şekilde her iki yönde de gezinebilirler. Ben sadece bir 'OnPageChangeListener' ekleyerek ve indeksleri orada kaydederek ilk çözümü denedim ama davranış tutarsız. Bazen, görüntülenen sayfa, bir sonraki parçanın örneklendirildiğini görebildiğim halde değişmeyecekti. – Igd

+0

Ayrıca, endeksleri manuel olarak izlemek, bu amaç için zaten mevcut olan güzel bir 'un-android' çözümü gibi hissettiriyor – Igd

+2

Hmm, neden bu tutarsızlık olduğundan emin değilim, ancak ViewPager'ı not etmek önemlidir aslında her zaman bellekte 3 sayfa tutulur: geçerli sayfa, önceki sayfa ve sonraki sayfa. Bu nedenle, şu anda 2. sayfada (sayfa 1, 2 ve 3 şu anda örnekleniyor) ve sonra sayfa 3'e geçin, örneğin, sayfa 4 başlatılacak ve sayfa 1 kaldırılacak. –

1
yapabilirdiBenzer bir problemim vardı, bunu çözdüm. Problemin ne olduğunu anladığımda, kodu probleminize uyarlayabilirsiniz. 6 fragmanı olan bir ViewPager'ım vardı ve sayfa geçmişini takip etmek ve geçmişte geriye doğru gitmek için geri düğmesini kullanmak istedim. Bir java.util.Stack<Integer> nesnesi oluşturuyorum, parça numarası ekledim (back düğmesini kullandığınızda, aşağıya bakın) ve onBackPressed() geçersiz kıldığınızda, geçmiş yığınım boş değilken arka yığını kullanmak yerine en son görüntülenen parçayı çıkardım.

Geri düğmesine bastığınızda Yığın üzerindeki öğeleri itmekten kaçınmak istersiniz; aksi halde, arkadan çıkmak yerine geri düğmesini kullanmaya devam ederseniz, iki parça arasında sıkışırsınız.

Kodum:

MyAdapter mAdapter; 
ViewPager mPager; 
Stack<Integer> pageHistory; 
int currentPage; 
boolean saveToHistory; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mAdapter = new MyAdapter(getSupportFragmentManager()); 
    mPager = (ViewPager)findViewById(R.id.container); 
    mPager.setAdapter(mAdapter); 
    mPager.setOffscreenPageLimit(5); 

    pageHistory = new Stack<Integer>(); 
    mPager.setOnPageChangeListener(new OnPageChangeListener() { 

     @Override 
     public void onPageSelected(int arg0) { 
      if(saveToHistory) 
       pageHistory.push(Integer.valueOf(currentPage)); 
     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
     } 
    }); 
    saveToHistory = true; 
} 

@Override 
public void onBackPressed() { 
    if(pageHistory.empty()) 
     super.onBackPressed(); 
    else { 
     saveToHistory = false; 
     mPager.setCurrentItem(pageHistory.pop().intValue()); 
     saveToHistory = true; 
    } 
}; 
2

Kullanım Fragment Etkinlik sınıfında bu kodu. Geri dönüşü eklemeyi unutmayın; Yeni tasarım desteği kütüphanesinde

public boolean onKeyDown(int keyCode, KeyEvent event) { 

    // TODO Auto-generated method stub 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) { 

      mViewPager.setCurrentItem(viewPageSelected - 1); 
      return true; 
     } 

    return super.onKeyDown(keyCode, event); 

} 
8

i aynı sorun var ve ben yığını ve itme oluşturmak viewpager 3 parçası vardır ana aktivitede bu adımı

izleyin bu
kullanmak ve pop veri.

//private Stack<Integer> stackkk; ==> As i get edit suggestion 
private Stack<Integer> stackkk = new Stack<>(); // Edited 
private ViewPager mPager; 
private int tabPosition = 0; 



    mTabLayout.setupWithViewPager(mPager); 
    mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout)); 
    mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      tabPosition = tab.getPosition(); 
      mPager.setCurrentItem(tab.getPosition()); 

      if (stackkk.empty()) 
       stackkk.push(0); 

      if (stackkk.contains(tabPosition)) { 
       stackkk.remove(stackkk.indexOf(tabPosition)); 
       stackkk.push(tabPosition); 
      } else { 
       stackkk.push(tabPosition); 
      } 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 
      tabPositionUnselected = tab.getPosition(); 
     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 
     } 
    }); 
} 

ve aktivitede onBackPressed içinde

,

@Override 
public void onBackPressed() { 
    if (stackkk.size() > 1) { 
     stackkk.pop(); 
     mPager.setCurrentItem(stackkk.lastElement()); 
    } else { 
    } 
} 
+0

Benim düzenleme için teşekkür ederiz Düzenleme kodum değiştirildi olarak kodum formu özel Stack stackkk; için özel Yığın stackkk = new Yığın <>(); Her zaman yeni nesne oluşturuldu. –

0

Ben özel ViewPager yapılmış ve içinde yığın işlevi uygulamak ettik.

public class CustomViewPager extends ViewPager { 

private Stack<Integer> stack = new Stack<>(); 

@Override 
public void setCurrentItem(int item, boolean smoothScroll) { 
    stack.push(getCurrentItem()); 
    super.setCurrentItem(item, smoothScroll); 
} 

public int popFromBackStack(boolean smoothScroll) { 
    if (stack.size()>0) { 
     super.setCurrentItem(stack.pop(), smoothScroll); 
     return getCurrentItem(); 
    } else return -1; 
}