0

Activity使用して設定メニューを表示する がありますPreferenceFragment。s のリストをフラグメントに渡すメソッドがあり、基本的にボタンのように動作させたい s のBeanリストを動的に生成できます。Preferenceクリックされた環境設定の 1 つに反応するために を使用しようとしてOnPreferenceClickListenerいますが、最も外側のアクティビティにこれを知らせる必要があります。私のコードは次のようになります。

public class PairActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fragment = new SettingsFragment();
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, fragment)
                .commit();
        ...
    }


    public static class SettingsFragment extends PreferenceFragment {
        public void displayBeans(Collection<Bean> beans) {
            ...
            for(Bean bean : beans) {
                Preference pref = new Preference(getActivity());
                pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        // want to let the Activity know something happened
                    }
                });
            }
        }
    }

    ...
}

コメントは、どこからアクティビティに到達したいかを示していますが、静的クラス内の匿名クラス内にあります...問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

編集:

あなたSettingsFragment内部クラスを作るPairActivity

public class PairActivity extends Activity {

    public class SettingsFragment extends PreferenceFragment {

    }

}

その後、アクティビティを安全に参照できますPairActivity.this

編集:

それはあなたがリンクした素晴らしい答えであり、実際にそのように使用する適切な方法です。私はそれについて考えませんでした。

それでも、フラグメントがアクティビティにアタッチされている場合は、 を使用して参照できますgetActivity。clickListener の内部からこのメソッドを呼び出すと、フラグメントは間違いなくアクティビティにアタッチされるため、これを実行しても問題ありません。

public class PairActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fragment = new SettingsFragment();
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, fragment)
                .commit();
        ...
    }


    public static class SettingsFragment extends PreferenceFragment {
        public void displayBeans(Collection<Bean> beans) {
            ...
            for(Bean bean : beans) {
                Preference pref = new Preference(getActivity());
                pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {
                        PairActivity pairActivity = (PairActivity) getActivity();
                        // Do something with pairActivity instance
                    }
                });
            }
        }
    }

    ...
}

(PairActivity)キャストが例外をスローするため、フラグメントを別のアクティビティにアタッチしないようにする必要があります。

于 2015-05-24T12:30:04.153 に答える