2012-05-23 155 views
6

我使用三个视图创建ViewPager。第一个视图是一个ListView,其中onItemClick用其中的WebView替换该片段的新片段。我有两个问题:在WebView中添加'transaction.addToBackStack(null)'或'transaction.setCustomAnimations(...)'片段以显示。没有这些行显示,但我不能做BACK按钮返回列表。Android - 在ViewPager中替换片段的Backstack

我正在创建基于that tutorialthis SO question的代码。在那个问题中使用了PagerAdapter,而我正在使用FragmentPagerAdapter。我也不需要更多的碎片来替换。它只能有一次(从列表到webView并返回)。

这里是我的适配器代码:

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

,并从onCreateView该名单的片段的摘要():

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

回答

2

看看我的新的答案中提到的问题:https://stackoverflow.com/a/11974777/685292

你可以看到一个例子,如何实现简单的后面堆叠ViewPager由你自己addToBackStack(null)不适用于ViewPager片段。另外请注意,关于您的问题的主要问题可能是缺少getItemId(int position)重写方法。

0

在新的设计支持库,我用这个解决方案
您可以使用堆栈推位置在堆栈和堆栈使用弹出取回存储tabpositon。

在viewpager中有3个片段的主要活动中,我创建堆栈 和推送和弹出数据。

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

,并在onBackPressed的活动,

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

希望这可以帮助