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 はフラグメントの状態を保存します

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;

アクティビティの 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 に答える
-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 に答える