我有遗留代码,它使用名为" Preferences"的子类扩展了PreferenceActivity。 PreferenceActivity的调用如下:
Intent intent = new Intent(this, Preferences.class);
this.startActivity(intent);
OnSharedPreferenceChangeListener存在于另一个片段(不是PreferenceActivity子类)中,但需要引用PreferenceActivity以修改自定义首选项/控件的属性,类似于以下内容:
pref = (CheckBoxPreference) prefActivity.findPreference(res.getString(R.string.keyAccount));
pref.setSummary("something");
其中" prefActivity"是对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是我们的共享首选项侦听器(除其他外)。在此代码中,我们要修改自定义首选项控件/条目(即,不是首选项值本身,而是首选项控件上的属性,例如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子类"偏好"只需打开“设置”视图。
public class Preferences extends PreferenceActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_cp);
}
}
正如我所提到的,我们更喜欢能够在CPFragment中修改自定义首选项(而不是PreferenceActivity)。因此,我在寻找在CPFragment中作为onSharedPreferenceChangeListener响应时定位PreferenceActivity的一些方法。
答案 0 :(得分:4)
如果我正确理解您的问题,您的Activity
名为Preferences
extends
PreferenceActivity
。您还有Fragment
已注册OnSharedPreferenceChangeListener
。您需要更新Preferences
Activity
中的用户界面,但您不确定如何完成此操作。
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)永远不要为static
创建Activity
引用。 public static CPActivity inst;
。这可能导致内存泄漏。
2)考虑将Preferences
Activity
中的代码移至PreferenceFragment
。
3)目前还不清楚你想要实现的目标。您要在CheckBoxPreference
或CPFragment
Preferences
中修改Activity
吗?
4)您仍应考虑使用两个OnSharedPreferenceChangeListener
或EventBus。