简体   繁体   English

动态更改Custom PreferenceScreen的数据

[英]Dynamically change data of Custom PreferenceScreen

I am working on custom PreferenceScreen , I have created a custom screen for the settings page using PreferenceActivity . 我正在使用自定义PreferenceScreen ,我使用PreferenceActivity为设置页面创建了自定义屏幕。

Below is my preference screen. 以下是我的偏好屏幕。

在此输入图像描述

Issue:- I need to change badge of Download data dynamically. 问题: -我需要动态更改下载数据的徽章。 I followed this question for achieve this layout. 我按照这个问题来实现这个布局。 I already tried all answer of that question but not working single answer. 我已经尝试过这个问题的所有答案,但没有单独回答。

Is there any other way to find View which is inside preference? 有没有其他方法可以找到哪个内部偏好?

settings.xml 的settings.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

<Preference android:title="@string/settings_user_profile" android:key="user_profile" android:summary="@string/settings_user_profile_desc" android:layout="@layout/setting_list"></Preference>
<Preference android:title="@string/settings_download" android:key="download_data" android:summary="@string/settings_download_desc" android:layout="@layout/setting_list"></Preference>
</PreferenceScreen>

You can subclass Preference , overriding onBindDialogView() - just remember to change the XML from <Preference...> to include your package and class <com.example.app.BadgedPreference...> : 您可以子类化Preference ,覆盖onBindDialogView() - 只需记住从<Preference...>更改XML以包含您的包和类<com.example.app.BadgedPreference...>

@Override
protected void onBindDialogView(View v) {
    super.onBindDialogView(v);
    Log.v( "onBindDialogView()", v.getClass().getSimpleName() );
}

If your BadgedPreference has a method for handling your change, you can use it a bit more easily - from within your PreferenceActivity : 如果您的BadgedPreference有一个处理更改的方法,您可以更轻松地使用它 - 从PreferenceActivity

PreferenceScreen myPrefScreen = (PreferenceScreen)getPreferenceScreen();
BadgedPreference bp = (BadgedPreference)myPrefScreen.findPreference("download_data");
// Custom method
bp.setBadgeValue(12);

Even more simply, you can use a standard Preference , just style its summary field as a 'badge', then you can set the value using the included Summary field: 更简单地说,您可以使用标准Preference ,只需将其摘要字段设置为“徽章”,然后您可以使用包含的摘要字段设置值:

Preference pref = (Preference)myPrefScreen.findPreference("download_data");
pref.setSummary("12");

Let me know if you have any questions. 如果您有任何疑问,请告诉我。

You can implement OnSharedPreferenceChangeListener Something like this: 你可以实现OnSharedPreferenceChangeListener东西:

  @Override
  public void onResume() {
      super.onResume();

      // Set up a listener whenever a key changes
      getPreferenceScreen().getSharedPreferences()
         .registerOnSharedPreferenceChangeListener(this);        
  }

  @Override
  protected void onPause() {
       super.onPause();

      // Unregister the listener whenever a key changes
      getPreferenceScreen().getSharedPreferences()
         .unregisterOnSharedPreferenceChangeListener(this);
  }

  @Override
  public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {

       //update summary  
       updatePrefsSummary(sharedPreferences, findPreference(key));
  }

If you use standard Preference you can try something like this: 如果您使用标准偏好,您可以尝试这样的事情:

/**
 * Update summary
 * 
 * @param sharedPreferences
 * @param pref
 */
 protected void updatePrefsSummary(SharedPreferences sharedPreferences,
    Preference pref) {

if (pref == null)
    return;

if (pref instanceof ListPreference) {
    // List Preference
    ListPreference listPref = (ListPreference) pref;
    listPref.setSummary(listPref.getEntry());

} else if (pref instanceof EditTextPreference) {
    // EditPreference
    EditTextPreference editTextPref = (EditTextPreference) pref;
    editTextPref.setSummary(editTextPref.getText());

} else if (pref instanceof MultiSelectListPreference) {
    // MultiSelectList Preference
    MultiSelectListPreference mlistPref = (MultiSelectListPreference) pref;
    String summaryMListPref = "";
    String and = "";

    // Retrieve values
    Set<String> values = mlistPref.getValues();
    for (String value : values) {
        // For each value retrieve index
        int index = mlistPref.findIndexOfValue(value);
        // Retrieve entry from index
        CharSequence mEntry = index >= 0
                && mlistPref.getEntries() != null ? mlistPref
                .getEntries()[index] : null;
        if (mEntry != null) {
            // add summary
            summaryMListPref = summaryMListPref + and + mEntry;
            and = ";";
        }
    }
    // set summary
    mlistPref.setSummary(summaryMListPref);

} else if (pref instanceof RingtonePreference) {
    // RingtonePreference
    RingtonePreference rtPref = (RingtonePreference) pref;
    String uri;
    if (rtPref != null) {
        uri = sharedPreferences.getString(rtPref.getKey(), null);
        if (uri != null) {
            Ringtone ringtone = RingtoneManager.getRingtone(
                    getActivity(), Uri.parse(uri));
                pref.setSummary(ringtone.getTitle(getActivity()));
        }
    }

} 

} }

If you use custom preference, you can do everything, and you can override setSummary(int value) 如果您使用自定义首选项,则可以执行所有操作,并且可以覆盖setSummary(int value)

@Override
public void setSummary(int value) {
   setSummary(String.valueOf(value)+" ...." );
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM