1

3つのタブがある設定アクティビティがあります(各タブにはフラグメントが含まれています)+メインアクティビティにはボタン行もあります-[OK]ボタンと[キャンセル]ボタンがあります。[OK]を押すと、次のようになります。

1)すべてのフラグメントからすべてのカスタム変数を取得します2)共有設定に保存します

しかし、フラグメント変数にアクセスするにはどうすればよいですか?私はこれを試しました:

メインアクティビティにタブを追加する:

    ActionBar.Tab tab1 = actionbar.newTab().setText(res.getString(R.string.actSettingsTab1));
    tab1.setTabListener(new MyTabsListener(new Tab1Fragment(), "tab1"));
    actionbar.addTab(tab1);
    //...similar for all tabs

これは私のタブリスナーです:

class MyTabsListener implements ActionBar.TabListener {
    private Fragment fragment;
    private String tag;

    public MyTabsListener(Fragment fragment, String tag) {
        this.fragment = fragment;
        this.tag = tag;
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // do nothing
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.replace(R.id.fragment_container, fragment, tag);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(fragment);
    }
}

そして、これは私がフラグメントから変数を取得したい方法です:

Tab1Fragment tab1 = (Tab1Fragment) fm.findFragmentByTag("tab1");
Tab2Fragment tab2 = (Tab1Fragment) fm.findFragmentByTag("tab2");
Tab3Fragment tab3 = (Tab1Fragment) fm.findFragmentByTag("tab3");

しかし、それは奇妙です-findFragmentByTagは、選択されたタブに対してのみフラグメントを返します。それ以外の場合はnullを返します。したがって、tab1を選択して[OK]を押すと、findFragmentByTagはtab1のフラグメントを返しますが、他のフラグメントはnullを返します。

たぶん私は何か間違ったことをしているのか、私のトリング全体が間違った方向に進んでいるのかもしれません。親アクティビティのすべてのフラグメントから値を取得し、それらを共有設定に保存するにはどうすればよいですか?

4

3 に答える 3

0
ActionBar.Tab tab1 = actionbar.newTab().setText(res.getString(R.string.actSettingsTab1));
tab1.setTabListener(new MyTabsListener(new Tab1Fragment(), "tab1"));
actionbar.addTab(tab1);
//...similar for all tabs

これはフラグメントをバックスタックに追加しないため、選択したタブのみが表示され、他のタブはnullになります。

getTabCount()を使用してActionBarのタブを反復処理するのが最善の方法だと思います。そうすれば、 getTabAt(int index)を使用してコンテンツを取得できるはずです。getCustomView()

于 2013-02-14T15:25:21.630 に答える
0

プロセスを 2 つのステップに分けます。

1) すべてのフラグメントからすべての設定をリアルタイムで (つまり、ユーザーが変更したときに) 収集します。リスナー パターンを使用して、特定のフラグメントが担当する設定をユーザーが変更したときに、フラグメントが接続されたリスナーに通知するインターフェイスを公開するようにします。アクティビティをリスナーとしてすべてのフラグメントにアタッチし、変更をキャプチャします (適切な構造に保存します)。

2) [OK] ボタンをクリックすると、アクティビティが SharedPreferences を使用して設定を保存するようにします。ユーザーが変更した設定については常にフラグメントにアクセスする必要はありません。

この方法では、一度にすべてのフラグメントにアクセスする必要はありません。これは、フラグメントがメモリから削除された場合には不可能です (特定の時間には表示されないため)。代わりに、選択/表示されるたびに、アクティビティをリスナーとして選択したフラグメントに再割り当てできます。

于 2013-02-14T15:44:01.700 に答える