非法状态例外:Can';片段的t change标签是android:switcher现在是android:switcher
我的活动使用非法状态例外:Can';片段的t change标签是android:switcher现在是android:switcher,android,android-fragments,android-viewpager,android-tablayout,fragmentpageradapter,Android,Android Fragments,Android Viewpager,Android Tablayout,Fragmentpageradapter,我的活动使用TabLayout+ViewPager 此处的选项卡和页面数量是动态的,具体取决于从服务器获取的数据 崩溃是通过Crashlytics报告的,我无法复制它 我的活动代码: @Override protected void onCreate(Bundle savedInstanceState) { boolean isAppRestarting = PrefUtils.getBoolean("app_restarting", false); if
TabLayout
+ViewPager
此处的选项卡和页面数量是动态的,具体取决于从服务器获取的数据
崩溃是通过Crashlytics报告的,我无法复制它
我的活动代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
boolean isAppRestarting = PrefUtils.getBoolean("app_restarting", false);
if (isAppRestarting) {
super.onCreate(null);
this.savedInstanceState = null;
} else {
super.onCreate(savedInstanceState);
this.savedInstanceState = savedInstanceState;
}
initSlidingTabs();
fetchSomeData(); // see onDataFetched() below
}
private void initSlidingTabs() {
List<FragmentWithTitle> sdsTabs = new ArrayList<>();
Logger.i("There is saved instance state");
ArrayList<String> titles = savedInstanceState.getStringArrayList(TAB_TITLES);
if (titles != null) {
for (int i = 0; i < titles.size(); i++) {
if (getFragment(i) != null) {
sdsTabs.add(new FragmentWithTitle(getFragment(i), titles.get(i)));
}
}
}
mTabsAdapter = new MyTabsAdapter(getSupportFragmentManager(), sdsTabs);
mViewPager = (ViewPager) findViewById(R.id.layoutViewPagerSlidingTabs);
mViewPager.setAdapter(mTabsAdapter);
mViewPager.setOffscreenPageLimit(2);
mSlidingTabs = (TabLayout) findViewById(R.id.tabs);
mSlidingTabs.setupWithViewPager(mViewPager);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mTabsAdapter != null) {
outState.putStringArrayList(TAB_TITLES, mTabsAdapter.getTitles());
}
}
private Fragment getFragment(int position) {
return savedInstanceState == null ? mTabsAdapter.getItem(position) : getSupportFragmentManager()
.findFragmentByTag(getFragmentTag(position));
}
private String getFragmentTag(int position) {
return "android:switcher:" + R.id.layoutViewPagerSlidingTabs + ":" + position;
}
/**
Callback of fetchData() in onCreate()
*/
private void onDataFetched(List<AbcObject> abcObjects) {
if (savedInstanceState == null) {
if (abcObjects != null) {
for (AbcObject abcObject : abcObjects) {
mTabsAdapter.addTab(new FragmentWithTitle(AbcFragment.newInstance(), abcObject.getTitle()));
}
}
} else {
Logger.d("There is saved instance state");
ArrayList<String> titles = savedInstanceState.getStringArrayList(TAB_TITLES);
if (titles != null) {
for (int i = 0; i < titles.size(); i++) {
mTabsAdapter.addTab(new FragmentWithTitle(getFragment(i), titles.get(i)));
}
}
}
mTabsAdapter.notifyDataSetChanged();
}
片名:
public class FragmentWithTitle {
public FragmentWithTitle(Fragment mFragment, CharSequence mTitle) {
this.fragment = mFragment;
this.title = mTitle;
}
public Fragment getFragment() {
return fragment;
}
public void setFragment(Fragment fragment) {
this.fragment = fragment;
}
public CharSequence getTitle() {
return title;
}
public void setTitle(CharSequence title) {
this.title = title;
}
private Fragment fragment;
private CharSequence title;
}
FragmentPagerAdapter
已经为您缓存了片段。每个片段分配一个标记,然后FragmentPagerAdapter
尝试调用findFragmentByTag
。如果findFragmentByTag
的结果为null
,它只调用getItem()
您可能会收到此错误,因为您正在将相同的片段实例添加到列表中。您应该为每个页面创建一个新实例
示例表单文档:
//...
public static class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
return ArrayListFragment.newInstance(position);// IMPORTANT
}
}
//..
参考:
主线:听起来很像:。我知道,读过了,但我不能从那里的答案中应用任何东西@Tigger请添加你的类FragmentWithTitle
@eric读过这篇文章…你可能会想出一些解决方法谢谢@PN10,但这与我的问题无关谢谢@Charuක, 内存管理方面有什么缺点吗?@eric您的意思是返回新实例,我想没有,它只会被调用findFragmentByTag为null请检查片段名称数组的大小和适配器大小。这将是解决问题的关键。
public class FragmentWithTitle {
public FragmentWithTitle(Fragment mFragment, CharSequence mTitle) {
this.fragment = mFragment;
this.title = mTitle;
}
public Fragment getFragment() {
return fragment;
}
public void setFragment(Fragment fragment) {
this.fragment = fragment;
}
public CharSequence getTitle() {
return title;
}
public void setTitle(CharSequence title) {
this.title = title;
}
private Fragment fragment;
private CharSequence title;
}
//...
public static class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
return ArrayListFragment.newInstance(position);// IMPORTANT
}
}
//..