Android OnPreferenceClickListener
Posted
技术标签:
【中文标题】Android OnPreferenceClickListener【英文标题】: 【发布时间】:2015-08-06 01:15:12 【问题描述】:我有一个Activity
,它使用PreferenceFragment
显示设置菜单。有一种方法可以将Bean
s 列表传递给片段,因此它可以动态生成Preference
s 列表,我想基本上像按钮一样操作。我正在尝试使用OnPreferenceClickListener
对被单击的首选项之一做出反应,但我需要让最外面的活动知道这一点。我的代码如下所示:
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,但它位于静态类中的匿名类中......我可以做些什么来解决我的问题?
【问题讨论】:
((PairActivity)SettingsFragment.this.getActivity())
是可能的,但我担心这行代码中某处可能会出现问题...
【参考方案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)
会抛出异常。
【讨论】:
我已经尝试过了,Android Studio 将此标记为潜在问题。有this question在谈论为什么不应该这样做,但我是新手,所以我不太了解。以上是关于Android OnPreferenceClickListener的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )