我有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,但是它位于静态类中的匿名类中...我该怎么做才能解决我的问题?
答案 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)
会抛出异常。