2012-05-23 156 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 
    } 
} 

希望這可以幫助