gpt4 book ai didi

android - 如何引用或 "find"一个PreferenceActivity?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:01:56 31 4
gpt4 key购买 nike

我有遗留代码,它使用名为“Preferences”的子类扩展 PreferenceActivity。 PreferenceActivity 的调用方式如下:

    Intent intent = new Intent(this, Preferences.class);
this.startActivity(intent);

OnSharedPreferenceChangeListener 存在于另一个 fragment (不是 PreferenceActivity 子类)中,但需要引用 PreferenceActivity 才能修改自定义首选项/控件的属性,类似于以下内容:

    pref = (CheckBoxPreference) prefActivity.findPreference(res.getString(R.string.keyAccount));
pref.setSummary("something");

其中“prefActivity”是对 PreferenceActivity 的引用。谁能建议如何在创建 PreferenceActivity 时保存对 PreferenceActivity 的引用,或者在需要时如何定位 PreferenceActivity?

编辑:包括极度简化的代码,希望有助于显示层次结构和澄清。

FragmentActivity CPActivity 实例化 CPFragment 并按需(按下按钮)创建一个 Intent 以触发 PreferenceActivity 子类(称为“首选项”)。

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 是我们共享的首选项监听器(除其他外)。正是在这段代码中,我们想要修改自定义首选项控件/条目(也就是说,不是首选项值本身,而是首选项控件上的属性,例如 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”除了调出“设置” View 外别无其他。

    public class Preferences extends PreferenceActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_cp);
}
}

正如我所提到的,我们希望能够修改 CPFragment 中的自定义首选项(而不是 PreferenceActivity)。因此,我一直在寻找某种方法来定位 PreferenceActivity,同时在 CPFragment 中响应为 onSharedPreferenceChangeListener。

最佳答案

如果我正确理解你的问题,你有一个名为 PreferencesActivityextends PreferenceActivity .您还有一个 Fragment 注册了 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");
}

另一种方法:

您还可以注册 OnSharedPreferenceChangeListener在您的 Preferences Activity 中,您将在偏好更改时收到通知。示例:

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) 永远不要创建对您的Activitystatic 引用。 public static CPActivity inst;。这可能会导致内存泄漏。

2) 考虑将您的Preferences Activity 中的代码移至PreferenceFragment .

3) 目前尚不清楚您要实现的目标。您要在 CPFragmentPreferences Activity 中修改 CheckBoxPreference 吗?

4) 你仍然应该考虑使用两个 OnSharedPreferenceChangeListener s 或 EventBus .

关于android - 如何引用或 "find"一个PreferenceActivity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36752222/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com