相关疑难解决方法(0)

从(子)PreferenceScreen返回时更新PreferenceActivity中的现有Preference项

我有一堆(Sub)PreferenceScreens的PreferenceActivity.每个这样的(Sub)PreferenceScreen代表一个帐户并且具有帐户 - 用户名作为其标题.

PreferenceScreen root = mgr.createPreferenceScreen(this);
for (MyAccountClass account : myAccounts) {
    final PreferenceScreen accScreen = mgr.createPreferenceScreen(this);

    accScreen.setTitle(account.getUsername());

    // add Preferences to the accScreen
    // (for instance a "change username"-preference)
    ...

    root.add(accScreen);
}
Run Code Online (Sandbox Code Playgroud)

当用户输入子PreferenceScreen并编辑帐户用户名时,我希望外部PreferenceScreen更新它的相关帐户的PreferenceScreen标题.

我试图添加......

usernamePref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        accScreen.setTitle(newValue.toString());
        return true;
    }
});
Run Code Online (Sandbox Code Playgroud)

...但是accScreen.setTitle似乎对外部PreferenceScreen没有生效.我注意到调用onContentChanged();实际上使它工作,但我意识到这可能不是这样做的首选方式.

我怀疑我应该postInvalidate()在某个地方调用一些视图,但我真的无法弄清楚什么视图以及何时进行操作.

PreferenceScreen android:摘要更新!可能正在经历与我相同的问题.

任何帮助赞赏.

android preferences invalidation preferenceactivity

9
推荐指数
1
解决办法
1万
查看次数

PreferenceActivity更新摘要

我有一个PreferenceActivity2级树的PreferenceScreens,类似于:

<PreferenceScreen>
  <PreferenceScreen android:key="A">
     <ListPreference/>
     <EditTextPreference/>
  </PreferenceScreen>
  <PreferenceScreen android:key="B">
     <ListPreference/>
     <EditTextPreference/>
  </PreferenceScreen>
  ...
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)

每个较低级别的偏好屏幕,例如A和B,正在收集两个相关的数据.我希望这些父项的摘要是两个子首选项的当前值的组合.

我尝试在叶子首选项上添加onPreferenceChangeListener并从那里更新摘要,但似乎没有.首选项都是在活动中以编程方式创建的,所以我在onCreate中做了类似的事情:

   leafListPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
       @Override
       public boolean onPreferenceChange(Preference preference, Object newValue) {
              // do some work
              prefScreenA.setSummary( /* get new summary based on newValue */);
              return true;
       }
  });
Run Code Online (Sandbox Code Playgroud)

然后我试图找到一个位置,我可以通知我已经从子页面返回到顶级首选项屏幕,以便我可以在此时更新.但是,我对如何显示下级屏幕感到困惑.看起来它们实际上是对话框,而不是完整的活动,因为onPause/onResume在它们之间移动时不会被调用.在返回顶级页面时,是否有一些我遗漏的方法会被调用?

我也尝试添加一个sharedPreferenceChangeListener,如所描述这里,但似乎从来没有被调用.

任何人都对我在这里缺少的东西有任何暗示,或者我错过的任何更简单的方法?

android

8
推荐指数
1
解决办法
7270
查看次数