我有一个Activity,它使用PreferenceFragment显示设置菜单。有一种方法可以将Bean的列表传递给片段,以便它可以动态生成Preference的列表,而我想本质上像按钮一样。我正在尝试使用OnPreferenceClickListener对被单击的首选项之一做出反应,但是我需要让最外面的Activity知道这一点。我的代码如下所示:

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
                    }
                });
            }
        }
    }

    ...
}


注释显示了我想从何处到达活动,但它在静态类内的匿名类内部……我该怎么解决我的问题?

最佳答案

编辑:


将您的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)会引发异常。

08-05 02:18