31
4

6 回答 6

36

我遇到了同样的问题,并尝试按照错误消息中的建议进行操作。我尝试了以下代码,它对我有用。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state)  {
     if (mMyView == null) {
         mMyView = new MyView(getActivity());
     } else {
         ((ViewGroup) mMyView.getParent()).removeView(mMyView);
     }

     return mPuzzleView; 
}
于 2012-08-11T10:57:36.550 回答
19

几个小时前,我开始为此寻找一个简单的解决方案,最后偶然发现了@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 片段被破坏


于 2014-09-12T16:13:07.770 回答
6

以下解决方案对我有用。它可以防止在切换选项卡时调用 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" ...
于 2012-10-18T21:46:21.043 回答
3
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; 
    }
于 2015-06-02T23:15:16.790 回答
0

更新

ViewPager我只是通过使用而不是ActionBar选项卡来避免这个问题。

于 2015-05-27T15:28:04.053 回答
-1

我遇到了同样的问题,但我所做的是,在 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);
    }
}
于 2014-03-31T11:35:31.680 回答