【发布时间】:2017-12-01 08:46:15
【问题描述】:
我有一个包含三个片段的活动。在其中一个片段中,我有一个由其他三个片段组成的浏览器。我在其中包含 viewpager 的片段中调用 getChildFragmentManager()。我已经搜索了 SO 并阅读了几乎所有与该主题相关的答案,例如:this 和 this,似乎最有用的是this,但无法解决我的问题。我想如果我可以在FragmentStatePagerAdapter 中为getItemPosition(Object object) 返回POSITION_NONE 并调用notifyDataSetChanged() 将解决我的问题,但每次我这样做时,我的应用程序都会因此错误而崩溃:
java.lang.IllegalStateException: FragmentManager 已经在执行 交易!!!
我提到我在片段中使用getChildFragmentManager()。
有人想出解决这个问题的办法吗?
这是父片段:
public class WordDetailFragment extends Fragment {
@BindView(R.id.word_parts_tab_layout)
TabLayout mTabLayout;
@BindView(R.id.word_part_view_pager)
ViewPager mViewPager;
private WordPagerAdapter mPagerAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_word_detail, container, false);
ButterKnife.bind(this, view);
mPagerAdapter = new WordPagerAdapter(getChildFragmentManager(), getActivity());
mViewPager.setAdapter(mPagerAdapter);
mTabLayout.setupWithViewPager(mViewPager);
return view;
}
public void notifyTranslateChanged() {
mViewPager.getAdapter().notifyDataSetChanged();
}
}
这是适配器的代码
public class WordPagerAdapter extends FragmentStatePagerAdapter {
final int PAGE_COUNT = 3;
private String[] tabTitles = new String[]{"Definition", "Example", "Col & fam"};
private Context context;
public WordPagerAdapter(FragmentManager fm, Context context) {
super(fm);
this.context = context;
}
@Override
public int getCount() {
return PAGE_COUNT;
}
@Override
public Fragment getItem(int position) {
Fragment fragment;
switch (position) {
case 0:
fragment = new WordDefinitionFragment();
break;
case 1:
fragment = new WordExampleFragment();
break;
case 2:
fragment = new WordColFamFragment();
break;
default: fragment = new WordDefinitionFragment();
}
return fragment;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position) {
// Generate title based on item position
return tabTitles[position];
}
}
viewpager 中的一个片段
public class WordDefinitionFragment extends Fragment {
@BindView(R.id.show_translate_switch)
Switch mShowTranslateSwitch;
private List<WordInfo> mWordInfoList;
private List<Definition> mDefinitionList;
private boolean mShowTranslation;
private View mView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_word_definition, container, false);
ButterKnife.bind(this, mView);
mShowTranslation = SharedPrefHelper.getBooleanInfo(getActivity(), getString(R.string.show_translate_key));
mShowTranslateSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (getActivity() != null)
((WordActivity) getActivity()).changeTranslateMode(b);
showTranslation(b);
}
});
return mView;
}
}
还有我的活动。您刚刚在此处包含了我认为需要的部分。
public class WordActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceSate) {
super.onCreate(savedInstanceSate);
setContentView(R.layout.activity_word);
}
public void changeTranslateMode(boolean show) {
SharedPrefHelper.setBooleanInfo(this, getString(R.string.show_translate_ke)y, show);
((WordDetailFragment)mWordDetailFragment).notifyTranslateChanged();
}
}
【问题讨论】:
-
请出示您拨打
notifyDataSetChanged的代码。 -
@KalaBalik 它在 notifyTranslateChanged 方法内的 WordDetailFragment 类中。
-
我看过这个,但是你从哪里打电话给
notifyTranslateChanged? -
我从活动内部的方法调用它。我将在一小时内使用该代码编辑我的问题。
-
@KalaBalik 我编辑了我的问题并提供了我的活动和片段。
标签: android android-fragments android-viewpager fragmentstatepageradapter