6 回答
我遇到了同样的问题,并尝试按照错误消息中的建议进行操作。我尝试了以下代码,它对我有用。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
if (mMyView == null) {
mMyView = new MyView(getActivity());
} else {
((ViewGroup) mMyView.getParent()).removeView(mMyView);
}
return mPuzzleView;
}
几个小时前,我开始为此寻找一个简单的解决方案,最后偶然发现了@roger 的答案,这为我节省了很多头发......
在其他实现中使用 ViewPager 时,我可以简单地调用:
mViewPager.setOffscreenPageLimit(//number of pages to cache);
所以,我很惊讶我花了这么多时间来解决这个问题。他给出的例子并不完全清楚,所以为了完整起见,这是我在 FragmentTabHost 中用于片段的代码
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FragmentExample extends Fragment {
private View rootView;
public FragmentExample() {
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
if (rootView == null) {
rootView = inflater.inflate(R.layout.fragment_example_layout, container, false);
// Initialise your layout here
} else {
((ViewGroup) rootView.getParent()).removeView(rootView);
}
return rootView;
}
}
我搜索了我在这里添加的以下关键短语,希望我可以从我刚刚经历的挫折中拯救其他人!
FragmentTabHost 保存 Fragment 状态
重新创建 FragmentTabHost 视图
FragmentTabHost 缓存片段
FragmentTabHost onCreateView 片段被破坏
以下解决方案对我有用。它可以防止在切换选项卡时调用 Fragment 的 onCreateView。
活动的 onCreate 应该添加所有片段并隐藏除第一个选项卡之外的所有片段:
ft.add(R.id.fragment_content, secondTabFragment);
ft.hide(secondTabFragment);
ft.add(R.id.fragment_content, firstTabFragment);
ft.show(firstTabFragment);
ft.commit();
currentFragment = firstTabFragment;
Activity 的 onTabSelected 应该只是隐藏当前片段并显示与所选选项卡对应的片段。
ft.hide(currentFragment);
ft.show(chosenFragment);
ft.commit();
currentFragment = chosenFragment;
请注意,更改设备方向将重新启动您的活动,然后重新创建您的片段。您可以通过在清单中添加此 configChanges 来避免这种情况:
<activity android:configChanges="keyboardHidden|orientation" ...
View mMyView = null;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
if (state == null) {
mMyView = new MyView(getActivity());
} else {
container.removeView(mMyView);
}
return mMyView;
}
更新
ViewPager
我只是通过使用而不是ActionBar
选项卡来避免这个问题。
我遇到了同样的问题,但我所做的是,在 ActionBar.TabListener 的回调中附加或分离片段之前,调用
fragmentManager.executePendingTransactions();
这为我解决了问题
@Override
public void onTabelected(Tab tab, FragmentTransaction ft, FragmentManager fm) {
fm.executePendingTransactions(); // **execute the pending transactions before adding another fragment.
if (mFragment == null) {
mFragment = Fragment.instantiate(mContext, mFragmentName);
ft.replace(android.R.id.tabcontent, mFragment, mTag);
} else {
ft.attach(mFragment);
}
}