如何参考或"找到"一个PreferenceActivity?

时间:2016-04-20 18:29:56

标签: android preferenceactivity

我有遗留代码,它使用名为" 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的一些方法。

1 个答案:

答案 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)目前还不清楚你想要实现的目标。您要在CheckBoxPreferenceCPFragment Preferences中修改Activity吗?

4)您仍应考虑使用两个OnSharedPreferenceChangeListenerEventBus