簡體   English   中英

PreferenceScreen android:摘要更新!

[英]PreferenceScreen android:summary update !

在我的Android應用程序中,我有一個PreferenceScreen父級,它有3個CheckBoxPreferences作為子級。

當我單擊父首選項屏幕,並顯示3個復選框時,我選擇其中一個,並在與復選框相關的Preference.OnPreferenceChangeListener中,我將父設置的preferenceScreen摘要設置為:

Parent.setSummary("string depending on the selection")

問題是,當我返回到父級時,它的摘要不會更新,即使內部值已相應地更改為設置的值。

有沒有人對這種行為有任何想法?

采用

Parent.setSummary("string depending on the selection");
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();

像魅力一樣工作,無論你改變總結的地方都可以使用。

這是正確的方法

Preference pref = findPreference(getString(R.string.key_of_pref));
PreferenceScreen parent = (PreferenceScreen) sf.findPreference(getString(R.string.key_of_preference_screen));
pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
   @Override
   public boolean onPreferenceChange(Preference preference, Object newValue) {
       boolean newValueBool = (Boolean) newValue;
       parent.setSummary(newValueBool ? "Summary is true" : "Summary is false");                                                  
       ((BaseAdapter) getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();
       // true to update the state of the Preference with the new value
       // in case you want to disallow the change return false
       return true;
  }
});

我發現它似乎通過使用getListView().invalidate()跟進setSummary()來工作setSummary() getListView().invalidate()

您可以在父PreferenceScreen上使用BaseAdapter.notifyDataSetChanged()來更新UI 請參閱此處以獲取示例代碼: 從(子)PreferenceScreen返回時更新PreferenceActivity中的現有Preference項

如果您使用支持偏好而不是去:

findPreference("your_preference").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

            public boolean onPreferenceChange(Preference preference, Object o) {
                getListView().getAdapter().notifyDataSetChanged();
                return true;
            }
        });

對片段而不是活動的新堅持似乎使這更難。 invalidate路由似乎不起作用,也沒有使用基礎視圖的方法。 感謝halxinate的回答,我現在已經設法解決了這個問題。 對於那些和我一樣新的人來說,這里有一些細節:

創建設置片段時,請在主活動中保存參考,例如:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    switch (item.getItemId()) {
    case R.id.action_preferences:
        if (getFragmentManager().getBackStackEntryCount() < 1) {
            FragmentTransaction trans = getFragmentManager()
                    .beginTransaction();
            // Save a reference to the settings fragment
            settingsFrag = new SettingsFragment();
            trans.replace(R.id.container, settingsFrag);
            trans.addToBackStack(null);
            trans.commit();
        }
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

然后,當您想要從OnSharedPreferenceChangeListener更新外部PreferenceScreen的摘要時, OnSharedPreferenceChangeListener使用此類內容。 請注意,您需要在首選項片段xml中為外部PreferenceScreen定義一個鍵(在本例中為android:key="prefs_root" ):

public static void setOuterSummaries(SettingsFragment sf) {
    // Set the outer preferences summaries
    if (sf == null)
        return;
    //Code to update the summaries....

    // Force the parent screen summaries to update
    prefScr = (PreferenceScreen) sf.findPreference("prefs_root");
    if (prefScr != null)
            ((BaseAdapter) prefScr.getRootAdapter()).notifyDataSetChanged();

}

OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    public void onSharedPreferenceChanged(SharedPreferences prefs,
            String key) {
        Log.e("L", "Change");
        setOuterSummaries(settingsFrag);
    }
};

請注意,您可以保存對BaseAdapter的引用而不是對設置片段的引用,但是當您考慮將其概括為多片段情況或動態創建片段內容的代碼時,此方法似乎更安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM