Android OnPreferenceClickListener

时间:2015-05-24 12:16:04

标签: java android preferencefragment 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,但是它位于静态类中的匿名类中...我该怎么做才能解决我的问题?

1 个答案:

答案 0 :(得分: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)会抛出异常。