我有一个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)
会引发异常。