Android OnPreferenceClickListener

Android OnPreferenceClickListener

我有一个 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
                    }
                });
            }
        }
    }

    ...
}

评论显示了我想从哪里到达 Activity,但它在静态 class 中的匿名 class 中...我该怎么做才能解决我的问题问题?

编辑:

让你的 SettingsFragment 成为 PairActivityinner class:

public class PairActivity extends Activity {

    public class SettingsFragment extends PreferenceFragment {

    }

}

然后您可以安全地使用 PairActivity.this 引用 activity。

编辑:

你链接的答案很好,而且确实是正确的使用方法。没想到

然而,当片段附加到 activity 时,您可以使用 getActivity 引用它。如果您从 clickListener 内部调用此方法,片段肯定会附加到 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) {
                        PairActivity pairActivity = (PairActivity) getActivity();
                        // Do something with pairActivity instance
                    }
                });
            }
        }
    }

    ...
}

您只需要确保您没有将片段附加到另一个 activity,因为转换 (PairActivity) 会抛出异常。