如何引用或"find"一个PreferenceActivity?
How to reference or "find" a PreferenceActivity?
我有遗留代码,它使用名为 "Preferences" 的子类扩展 PreferenceActivity。 PreferenceActivity 调用如下:
Intent intent = new Intent(this, Preferences.class);
this.startActivity(intent);
OnSharedPreferenceChangeListener 存在于另一个片段(不是 PreferenceActivity 子类)中,但需要引用 PreferenceActivity 才能修改自定义 preference/control 的属性,类似于以下内容:
pref = (CheckBoxPreference) prefActivity.findPreference(res.getString(R.string.keyAccount));
pref.setSummary("something");
其中 "prefActivity" 是对 PreferenceActivity 的引用。谁能建议如何在创建 PreferenceActivity 时保存对 PreferenceActivity 的引用,或者在需要时如何定位 PreferenceActivity?
编辑: 包括极度简化的代码,希望有助于显示层次结构和澄清。
FragmentActivity CPActivity 实例化 CPFragment 并按需(按下按钮)创建 Intent 以触发 PreferenceActivity 子类(称为 "Preferences")。
public class CPActivity extends FragmentActivity
{
public static CPActivity inst;
private CPFragment mFragmentCP;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
inst = this;
mFragmentCP = new CPFragment();
}
public void onSettingsButtonPressed() {
// Bring up the Preferences menu
Intent intent = new Intent(this, Preferences.class);
this.startActivity(intent);
}
}
CPFragment 是我们共享的首选项侦听器(除其他外)。正是在这段代码中,我们想修改自定义首选项 control/entry(也就是说,不是首选项值本身,而是首选项控件上的属性,例如 CheckBoxPreference)。我们想在这里做,因为这是计算相关数据的地方。
public class CPFragment extends Fragment implements OnSharedPreferenceChangeListener
{
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// In response to preference changes, we want to modify the PreferenceActivity controls.
// So it seems we would need a reference to the PreferenceActivity subclass "Preferences
}
}
最后,PreferenceActivity 子类 "Preferences" 除了调出“设置”视图外,几乎没有其他作用。
public class Preferences extends PreferenceActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_cp);
}
}
正如我提到的,我们希望能够修改 CPFragment 中的自定义首选项(而不是 PreferenceActivity)。因此,我一直在寻找某种方法来定位 PreferenceActivity,同时在 CPFragment 中响应为 onSharedPreferenceChangeListener。
如果我对你的问题的理解正确,你有一个名为 Preferences
的 Activity
,其中 extends
PreferenceActivity
. You also have a Fragment
that has registered an OnSharedPreferenceChangeListener
。您需要更新 Preferences
Activity
中的 UI,但您不确定如何完成此操作。
Fragment
是否附加到 Preferences
Activity
?如果是,那么您应该能够在 Fragment
:
中执行以下操作
if (getActivity() instanceof Preferences) {
Preferences activity = (Preferences) getActivity();
CheckBoxPreference pref = (CheckBoxPreference) activity.findPreference(getString(R.string.keyAccount));
pref.setSummary("something");
}
另一种方法:
您还可以在 Preferences
Activity
中注册一个 OnSharedPreferenceChangeListener
,当偏好发生变化时您会收到通知。示例:
public class Preferences extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
/* ... */
@Override protected void onStart() {
super.onStart();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.registerOnSharedPreferenceChangeListener(this);
}
@Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(getString(R.string.keyAccount))) {
CheckBoxPreference pref = (CheckBoxPreference) findPreference(key);
pref.setSummary("something");
}
}
@Override protected void onPause() {
super.onPause();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.unregisterOnSharedPreferenceChangeListener(this);
}
/* ... */
}
根据您编辑的答案需要考虑的一些事项:
1) 永远不要创建对 Activity
的 static
引用。 public static CPActivity inst;
。这可能会导致内存泄漏。
2) 考虑将 Preferences
Activity
中的代码移动到 PreferenceFragment
.
3) 目前还不清楚你想要达到什么目的。你要修改的CheckBoxPreference
是你的CPFragment
还是Preferences
Activity
?
4) 你仍然应该考虑使用两个 OnSharedPreferenceChangeListener
或一个 EventBus.
我有遗留代码,它使用名为 "Preferences" 的子类扩展 PreferenceActivity。 PreferenceActivity 调用如下:
Intent intent = new Intent(this, Preferences.class);
this.startActivity(intent);
OnSharedPreferenceChangeListener 存在于另一个片段(不是 PreferenceActivity 子类)中,但需要引用 PreferenceActivity 才能修改自定义 preference/control 的属性,类似于以下内容:
pref = (CheckBoxPreference) prefActivity.findPreference(res.getString(R.string.keyAccount));
pref.setSummary("something");
其中 "prefActivity" 是对 PreferenceActivity 的引用。谁能建议如何在创建 PreferenceActivity 时保存对 PreferenceActivity 的引用,或者在需要时如何定位 PreferenceActivity?
编辑: 包括极度简化的代码,希望有助于显示层次结构和澄清。
FragmentActivity CPActivity 实例化 CPFragment 并按需(按下按钮)创建 Intent 以触发 PreferenceActivity 子类(称为 "Preferences")。
public class CPActivity extends FragmentActivity
{
public static CPActivity inst;
private CPFragment mFragmentCP;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
inst = this;
mFragmentCP = new CPFragment();
}
public void onSettingsButtonPressed() {
// Bring up the Preferences menu
Intent intent = new Intent(this, Preferences.class);
this.startActivity(intent);
}
}
CPFragment 是我们共享的首选项侦听器(除其他外)。正是在这段代码中,我们想修改自定义首选项 control/entry(也就是说,不是首选项值本身,而是首选项控件上的属性,例如 CheckBoxPreference)。我们想在这里做,因为这是计算相关数据的地方。
public class CPFragment extends Fragment implements OnSharedPreferenceChangeListener
{
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// In response to preference changes, we want to modify the PreferenceActivity controls.
// So it seems we would need a reference to the PreferenceActivity subclass "Preferences
}
}
最后,PreferenceActivity 子类 "Preferences" 除了调出“设置”视图外,几乎没有其他作用。
public class Preferences extends PreferenceActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_cp);
}
}
正如我提到的,我们希望能够修改 CPFragment 中的自定义首选项(而不是 PreferenceActivity)。因此,我一直在寻找某种方法来定位 PreferenceActivity,同时在 CPFragment 中响应为 onSharedPreferenceChangeListener。
如果我对你的问题的理解正确,你有一个名为 Preferences
的 Activity
,其中 extends
PreferenceActivity
. You also have a Fragment
that has registered an OnSharedPreferenceChangeListener
。您需要更新 Preferences
Activity
中的 UI,但您不确定如何完成此操作。
Fragment
是否附加到 Preferences
Activity
?如果是,那么您应该能够在 Fragment
:
if (getActivity() instanceof Preferences) {
Preferences activity = (Preferences) getActivity();
CheckBoxPreference pref = (CheckBoxPreference) activity.findPreference(getString(R.string.keyAccount));
pref.setSummary("something");
}
另一种方法:
您还可以在 Preferences
Activity
中注册一个 OnSharedPreferenceChangeListener
,当偏好发生变化时您会收到通知。示例:
public class Preferences extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
/* ... */
@Override protected void onStart() {
super.onStart();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.registerOnSharedPreferenceChangeListener(this);
}
@Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(getString(R.string.keyAccount))) {
CheckBoxPreference pref = (CheckBoxPreference) findPreference(key);
pref.setSummary("something");
}
}
@Override protected void onPause() {
super.onPause();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.unregisterOnSharedPreferenceChangeListener(this);
}
/* ... */
}
根据您编辑的答案需要考虑的一些事项:
1) 永远不要创建对 Activity
的 static
引用。 public static CPActivity inst;
。这可能会导致内存泄漏。
2) 考虑将 Preferences
Activity
中的代码移动到 PreferenceFragment
.
3) 目前还不清楚你想要达到什么目的。你要修改的CheckBoxPreference
是你的CPFragment
还是Preferences
Activity
?
4) 你仍然应该考虑使用两个 OnSharedPreferenceChangeListener
或一个 EventBus.