簡體   English   中英

具有FragmentPagerAdapter成員的Android Viewpager旋轉后變為null

[英]Android Viewpager with FragmentPagerAdapter members of Fragment become null after rotation

我有一個帶有標簽的活動。 為了創建選項卡,我正在使用Fragments並使用以下適配器類:

class ViewPagerAdapter extends FragmentPagerAdapter
{
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

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

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

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }



    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

在托管選項卡的活動的oncreate函數中,我正在調用一種方法(請參見下文)來創建一些片段,將它們添加到ViewPagerAdapter的實例並將其設置為我的ViewPager UI元素的適配器。 片段之一還具有一些成員變量(字符串,等等)。 我在使用活動創建器創建片段時設置了這些。

這是我在活動中正在做的事情。 (為清晰起見,將其剝離,刪除了不相關的片段)。

 private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    SummaryTabFragment frag1 = new SummaryTabFragment();
    frag1.setUser(user);

    adapter.addFragment(frag1, "Summary");


    viewPager.setAdapter(adapter);
}

一切正常,除了旋轉屏幕時。 該應用程序崩潰了,其中片段中的對象變量位於onCreateView中,事實證明片段的每個成員都是null,因此我收到了NullPointerException。 這很奇怪,因為旋轉屏幕並重新創建活動后,我將再次創建新的片段,設置成員變量,將它們添加到適配器中,並像以前一樣設置viewPager。

我已經閱讀了Fragment的生命周期,但是不明白為什么這行不通,因為我只是在重新創建所有內容。

我認為問題出在具有某些成員變量(字符串等)的Fragment中。 旋轉時,frament將調用默認構造函數(不帶參數),因此您將丟失輸入數據。
要保留它,您應該嘗試實現onSaveInstanceState這是示例

  Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putString("key", value);  
         }

然后像這樣保留它

@Override
       public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
            if(savedInstanceState!=null){
                 int id =savedInstanceState.getInt("key"); // get the value agains
            }
        ...
    }

注意 :我建議您不要將Fragment構造函數與某些參數一起使用。 您應該使用Frament的默認構造函數,然后將Extras數據按捆綁方式放入Fragment

  Fragment fragment = new Fragment();
   Bundle bundle = new Bundle();
   bundle.putInt(key, value);
   fragment.setArguments(bundle);

然后在您的片段中,使用以下命令檢索數據(例如,在onCreate()中):

   Bundle bundle = this.getArguments();
   int myInt = bundle.getInt(key, defaultValue);

希望這個幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM