0

我正在使用以下簡單FragmentStatePagerAdapter並且我想要獲取對其中一個片段的引用,請記住它們可能已被銷燬。訪問FragmentStatePagerAdapter中的片段

public class MyStatePagerAdapter extends FragmentStatePagerAdapter { 

    private int count; 

    public MyStatePagerAdapter(FragmentManager fm, int count) { 
     super(fm); 
     this.count= count; 
    } 

    @Override 
    public Fragment getItem(int arg0) { 

     switch (arg0) { 
      case 0: 
       return MyFragment1.newInstance(); 

      case 1: 
       return MyFragment2.newInstance(); 

      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return count; 
    } 
} 

我看到this問題,其第二回答說,如果你叫FragmentStatePagerAdapter.instatiateItem,且已存在的片段的引用,也不會再打電話getItem()。我查看了源代碼here,並且我的理解確實是這樣。

但是,我想知道,我可以做類似以下的事情嗎?這看起來很直截了當,但是我沒有看到它在任何地方被使用的事實使我懷疑有些事情是我看不到的真正錯誤。

所以基本上我的問題是:使用類似下面的東西來訪問片段時會出現什麼錯誤?

public class MyStatePagerAdapter extends FragmentStatePagerAdapter { 

    private int count; 
    private MyFragment1 myFragment1; 
    private MyFragment2 myFragment2; 

    public MyStatePagerAdapter(FragmentManager fm, int count) { 
     super(fm); 
     this.count= count; 
    } 

    @Override 
    public Fragment getItem(int arg0) { 

     switch (arg0) { 
      case 0: 
       if (myFragment1 == null) { 
        myFragment1 = MyFragment1.newInstance(); 
       } 
       return myFragment1; 
      case 1: 
       if (myFragment2 == null) { 
        myFragment2 = MyFragment2.newInstance(); 
       } 
       return myFragment2; 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return count; 
    } 

} 

爲了得到它,我打電話給getItem(position)

+0

您也可以使用Fragment.instantiate() –

回答

1

我用這種方法看到的一個問題是myFragment1myFragment2不是null。假設你擺脫了null檢查。問題是您每次撥打getItem()時都會生成新的Fragment

我看到的另一個問題是getItem()將始終返回null。您的switch中沒有break對帳單,因此它將一直持續到default個案,即null。如果添加相應的breaks,則代碼不應編譯,直到在if(){...}之後添加相應的return語句爲止。

另外,我建議你養成爲你的方法的參數添加有意義的名字的習慣。

+0

是的,這就是爲什麼我對getItem()進行空檢查修改的原因。因此,如果我按原樣使用它(用我的意思是空檢查),是否還有其他問題可以看到? – kenny

+0

查看我的更新回答。 – Emmanuel

+0

你是對的休息,我忽略了它,代碼更新。然而,我想知道是否更爲基本的內容是錯誤的,內存管理方式。 – kenny

相關問題