2013-10-24 45 views
1

我有以下...換出片段失敗FragmentStatePagerAdapter

佈局

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

</LinearLayout> 

適配器代碼...

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter implements ActionBar.TabListener { 

    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 
    private Fragment f; 

    public ScreenSlidePagerAdapter(FragmentManager fm) { 
     super(fm); 
     this.addTab(actionBar.newTab().setText("Score"), ScoreFragment.class, null); 
     f = new TeamFragment(); 
     this.addTab(actionBar.newTab().setText("Team"), TeamFragment.class, null); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     if(position == 0){ 
      TabInfo info = mTabs.get(position); 
      return Fragment.instantiate(context, info.clss.getName(), info.args); 
     } 
     else{ 
      return f; 
     } 
    } 

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

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 
     TabInfo info = new TabInfo(clss, args); 
     tab.setTag(info); 
     tab.setTabListener(this); 
     mTabs.add(info); 
     actionBar.addTab(tab); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public void onTabReselected(Tab arg0, 
      android.app.FragmentTransaction arg1) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onTabSelected(Tab tab, android.app.FragmentTransaction arg1) { 
     Object tag = tab.getTag(); 
     for (int i = 0; i < mTabs.size(); i++) { 
      if (mTabs.get(i) == tag) { 
       mPager.setCurrentItem(i); 
      } 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab arg0, 
      android.app.FragmentTransaction arg1) { 
     // TODO Auto-generated method stub 

    } 

    /** 
    * @return the f 
    */ 
    public Fragment getF() { 
     return f; 
    } 

    /** 
    * @param f the f to set 
    */ 
    public void setF(Fragment f) { 
     startUpdate((ViewGroup)findViewById(R.id.pager)); 
     destroyItem((ViewGroup)findViewById(R.id.pager), 1, this.f); 
     this.f = f; 
     instantiateItem((ViewGroup)findViewById(R.id.pager), 1); 
     finishUpdate((ViewGroup)findViewById(R.id.pager)); 
     notifyDataSetChanged(); 
    } 

} 

然而,當我打電話SETF一個新片段,舊的消失如預期,但新的消失從未出現。有人可以幫我解決我做錯的事嗎?

我試圖改變到...

public void setF(Fragment f) { 
     ViewGroup g = (ViewGroup)findViewById(R.id.pager); 
     startUpdate(g); 
     destroyItem(g, 1, this.f); 
     this.f = f; 
     WebViewFragment v = (WebViewFragment)instantiateItem(g, 1); 
     FragmentManager fm = v.getFragmentManager(); 
     finishUpdate(g); 
     Fragment f3 = v; 
     f3.setUserVisibleHint(true); 
     setPrimaryItem(g,1,v); 
     notifyDataSetChanged(); 
    } 

,但現在我得到...

10-24 17:10:12.290: E/AndroidRuntime(1113): java.lang.NullPointerException 
10-24 17:10:12.290: E/AndroidRuntime(1113):  at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:819) 
10-24 17:10:12.290: E/AndroidRuntime(1113):  at android.support.v4.app.FragmentStatePagerAdapter.setPrimaryItem(FragmentStatePagerAdapter.java:152) 
10-24 17:10:12.290: E/AndroidRuntime(1113):  at android.support.v4.view.ViewPager.populate(ViewPager.java:1066) 

看起來也許一個競爭條件?

ActionBar with ViewPager - clicking partially visible tab crashes the app

更新

如果刪除了setPrimaryItem(克,1,V);那麼它似乎運行良好,直到我去另一個選項卡並回來。然後它以同樣的方式失敗。這讓我相信我做得有點正確,只是錯過了一些東西。

+0

你能否用文字完全解釋你做了什麼?我也有同樣的問題。碎片從不出現。這只是一個空白的佈局。 –

+0

過了一段時間,但給我一兩天,看看我能不能更清楚 – Jackie

+0

謝謝。我已經知道了。看看導致我的問題與您的問題有一點點不同的原因。 –

回答

0

這是功能版本,我不得不改變很多東西。我仍然想添加到BackStack(如果你能做到這一點,你會得到支票),但這應該幫助在同一條船上的任何人。

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter implements ActionBar.TabListener { 

    private ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 
    private List<Fragment> fragments = new ArrayList<Fragment>(); 

    public ScreenSlidePagerAdapter(FragmentManager fm) { 
     super(fm); 
     fragments.add(new ScoreFragment()); 
     fragments.add(new TeamFragment()); 
     this.addTab(actionBar.newTab().setText("Score"), ScoreFragment.class, null); 
     this.addTab(actionBar.newTab().setText("Team"), TeamFragment.class, null); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return fragments.get(position); 
    } 

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

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 
     TabInfo info = new TabInfo(clss, args); 
     tab.setTag(info); 
     tab.setTabListener(this); 
     mTabs.add(info); 
     actionBar.addTab(tab); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public void onTabReselected(Tab arg0, 
      android.app.FragmentTransaction arg1) {} 

    @Override 
    public void onTabSelected(Tab tab, android.app.FragmentTransaction arg1) { 
     Object tag = tab.getTag(); 
     for (int i = 0; i < mTabs.size(); i++) { 
      if (mTabs.get(i) == tag) { 
       mPager.setCurrentItem(i); 
      } 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab arg0, 
      android.app.FragmentTransaction arg1) {} 

    /** 
    * @param f the f to set 
    */ 
    public void setF(Fragment f) { 
     int loc = actionBar.getSelectedTab().getPosition(); 
     fragments.set(loc, f); 
     notifyDataSetChanged(); 
    } 
    @Override 
    public int getItemPosition(Object object) { 
     if(object instanceof Fragment){ 
      if(fragments.contains(object)) 
       return POSITION_UNCHANGED; 

     } 
     return POSITION_NONE; 
    } 
} 
0

試圖使用轉換片段來替換,添加或刪除片段有時不會有詞,它只是顯示一個空白的佈局。出現這個問題是因爲某些原因。我遇到了這個問題,我想清楚了。這只是我在fragmentActivity中實現onCreate方法的方式。

這究竟是怎麼回事:

protected void onCreate(android.os.Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mybooks); 
    } 

當我改變android.os.Bundle只是Bundle問題就消失了。我希望這可以幫助任何有這個問題的人。

相關問題