![](/img/trans.png)
[英]ViewPager findViewById is null after screen rotation in android
[英]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.