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
成为 PairActivity
的 inner 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)
会抛出异常。
我有一个 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
成为 PairActivity
的 inner 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)
会抛出异常。