2012-05-23 17 views
6

Sto creando ViewPager con tre viste. Nella prima vista c'è una ListView, dove onItemClick sostituisce quel frammento di nuovo frammento con WebView in esso. E ho due problemi: quando si aggiunge "transazione.addToBackStack (null)" o "transaction.setCustomAnimations (...)" Frammento con interruzioni WebView da mostrare. Senza queste righe mostra, ma non posso fare il pulsante BACK per tornare alla lista.Android - Backstack mentre si sostituisce il frammento in ViewPager

Stavo creando codice basato su that tutorial e this SO question. In quella domanda viene usato PagerAdapter e sto usando FragmentPagerAdapter. Inoltre non ho bisogno di più frammenti da sostituire. Può essere una sola volta (dalla lista alla WebView e viceversa).

Ecco il codice del mio adattatore:

public Fragment getItem(int position) 
{ 
    Fragment fragment = null; 
    switch (position) 
    { 
     case 0: // news 
      if (mFragmentAtPos0 == null) 
      { 
       mFragmentAtPos0 = new NewsListFragment(new FirstPageFragmentListener() 
       { 
        @Override 
        public void onSwitchToNewsFragment(String url, ViewGroup container) 
        { 
         FragmentTransaction transaction = fm.beginTransaction(); 
         transaction.setCustomAnimations(R.anim.rotate_in, R.anim.rotate_out, R.anim.rotate_in, R.anim.rotate_out); 

         WebViewFragment wv = new WebViewFragment(url, context); 
         transaction.replace(container.getId(), wv); 
         transaction.commit(); 

         mFragmentAtPos0 = wv; 
         notifyDataSetChanged(); 
        } 
       }); 
      } 
      fragment = mFragmentAtPos0; 
      break; 
     case 1: 
      fragment = new NewsInfoFragment(context, true); 
      break; 
     case 2: 
      fragment = new NewsInfoFragment(context, false); 
      break; 
    } 
    return fragment; 
} 

e frammento onCreateView() del frammento di listino:

listView.setOnItemClickListener(new OnItemClickListener() 
    { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { 
      if (position < listNewsAdapter.getCount() - 1) 
      { 
       if (listener != null) 
       { 
        listener.onSwitchToNewsFragment(listNewsAdapter.getItem(position).getNewsUrl(), container); 
       } 
      } 
     } 
    }); 

risposta

2

controllare il mio nuova risposta alla questione di cui: https://stackoverflow.com/a/11974777/685292

È puoi vedere un esempio su come implementare il back stacking semplice con ViewPager da solo dal addToBackStack (null) non funziona per frammenti ViewPager. Si noti inoltre che il problema principale relativo al problema è probabilmente la mancanza del metodo getItemId (int position) override.

0

In nuova libreria di supporto alla progettazione, io uso questa soluzione
È possibile utilizzare stack per memorizzare il tabpositon spingendo la posizione nello stack e tornare utilizzando pop in stack.

Nell'attività principale in cui sono presenti 3 frammenti in viewpager, creo lo stack e invio e pop dei dati.

private Stack<Integer> stackkk; 
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) { 
     } 
    }); 
} 

e nel onBackPressed dell'attività,

@Override 
public void onBackPressed() { 
    if (stackkk.size() > 1) { 
     stackkk.pop(); 
     mPager.setCurrentItem(stackkk.lastElement()); 
    } else { 
//do wat you want 
    } 
} 

Spero che questo può aiutare

Problemi correlati