0

編集 前の質問を編集して解決しました。返信ありがとうございます。

3 つのタブ (ニュース、戦略、履歴) を持つ gui があり、そのうちの 1 つ (ニュース) に ExpandableListView をロードし、ユーザーがリストのアイテムの 1 つをクリックすると、選択したアイテムの詳細を含む別のフラグメントをロードします. このコードを使用して、そのタブのフラグメントを別のフラグメントに置き換えることができました。

    CategoryTab categories = new CategoryTab();//Fragment 2
    FragmentManager manager = activity.getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(this.getId(), categories, "News");
    //transaction.replace(android.R.id.content, categories, "News");
    transaction.addToBackStack(null);
    transaction.commit();

秒のフラグメントが [ニュース] タブに読み込まれると、他のすべてのタブにそのフラグメントが表示されます。このリスナーを使用してタブ ナビゲーションを管理しています

public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;
    private final Bundle mArgs;
    private Fragment mFragment;

    public TabListener(Activity activity, String tag, Class<T> clz) {
        this(activity, tag, clz, null);
    }

    public TabListener(Activity activity, String tag, Class<T> clz, Bundle args) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
        mArgs = args;

        // Check to see if we already have a fragment for this tab, probably
        // from a previously saved state.  If so, deactivate it, because our
        // initial state is that a tab isn't shown.
        mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
        if (mFragment != null && !mFragment.isDetached()) {
            FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();
            ft.detach(mFragment);
            ft.commit();
        }
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        if (mFragment == null) {
            mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            ft.attach(mFragment);
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {          
        if (mFragment != null) {
            ft.detach(mFragment);
        }
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show();
    }
}

私の質問は、置換が完了したときにすべてのタブに同じフラグメントが表示されるのはなぜですか? そして、アクションバーにあるアイコンで戻るボタンをシミュレートして、ニュースタブにフラグメント1を再度ロードするにはどうすればよいですか?

どんな助けでも大歓迎です

PD: 私の英語でごめんなさい

4

1 に答える 1

1

前と同じように、onActivityCreated の中または後に getActivity() を呼び出すようにしてください。その後は null が返されます。

Fragment は onActivityCreated まで null アクティビティにアタッチされます。つまり、onCreate または onCreateView で getActivity() を呼び出すと、Activity がまだ作成されていないため、null が返されます。したがって、 onActivityCreated 内または後に getActivity() へのすべての呼び出しがあることを確認してください

于 2013-01-28T15:44:07.860 に答える