2012-05-23 17 views
6

estoy creando ViewPager con tres viewsin ella. En la primera vista es un ListView, donde onItemClick reemplaza ese fragmento nuevo fragmento con WebView en él. Y tengo dos problemas: al agregar 'transaction.addToBackStack (null)', o 'transaction.setCustomAnimations (...)' Fragment with WebView se detiene para mostrarse. Sin estas líneas se muestra, pero no puedo hacer el botón ATRÁS para volver a la lista.Android - Backstack al sustituir el fragmento en ViewPager

estaba creando código basado en that tutorial y this SO question. En esa pregunta, se utiliza PagerAdapter, y estoy usando FragmentPagerAdapter. Además, no necesito más fragmentos para reemplazar. Puede ser solo una vez (de la lista a webView y viceversa).

Aquí es el código de mi adaptador:

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; 
} 

y fragmento de onCreateView() de un fragmento de esa lista:

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); 
       } 
      } 
     } 
    }); 

Respuesta

2

Compruebe hacia fuera mi nueva respuesta a la pregunta mencionada: https://stackoverflow.com/a/11974777/685292

Usted puede ver que hay un ejemplo de cómo implementar vuelta sencilla de apilamiento con ViewPager por su propio puesto addToBackStack (null) no funciona para ViewPager fragmentos. También tenga en cuenta que el principal problema acerca de su problema es probablemente la falta GetItemID (posición int) método sobreescrito.

0

En la nueva biblioteca de soporte de diseño, utilizo esta solución
Puede utilizar la pila para almacenar la tabpositon empujando la posición en la pila y volver mediante el uso de pop en la pila.

En la actividad principal donde hay 3 fragmentos en viewpager, creo la pila y los datos push y pop.

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) { 
     } 
    }); 
} 

y en el onBackPressed en la actividad,

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

la esperanza que esto puede ayudar

Cuestiones relacionadas