2010-09-30 46 views
22

对于Android来说,我有一些代码,当用户更改首选项时,我将UI首选项中的摘要字段更新为它们输入的值。但是,在创建首选项活动时,我想将摘要字段设置为相应首选项中的值。 请指教。谢谢。将UI首选项摘要字段设置为首选项的值

public class MyPreferenceActivity extends PreferenceActivity implements 
     OnSharedPreferenceChangeListener { 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preference); 
     SharedPreferences sp = getPreferenceScreen().getSharedPreferences(); 
     sp.registerOnSharedPreferenceChangeListener(this); 
    } 

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
      String key) { 
     Preference pref = findPreference(key); 
     if (pref instanceof EditTextPreference) { 
      EditTextPreference etp = (EditTextPreference) pref; 
      pref.setSummary(etp.getText()); 
     } 
    } 
} 
+1

可能出现[如何在首选项摘要中显示Android首选项的当前值?](http://stackoverflow.com/questions/531427/how-do-i-display-the-current -Android-preference-in-the-preference-su) – 2013-03-25 00:06:48

回答

45

我也是新的,所以可能不是最好的代码,但这与我所做的相似。你可能想注册你的监听器onResume并注销onPause,而不是onCreate。我希望这有帮助。

主要你只需要抓住pref,pref值并设置摘要。

public class MyPreferenceActivity extends PreferenceActivity implements 
     OnSharedPreferenceChangeListener { 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preference); 
     SharedPreferences sp = getPreferenceScreen().getSharedPreferences(); 
     EditTextPreference editTextPref = (EditTextPreference) findPreference("thePrefKey"); 
     editTextPref 
       .setSummary(sp.getString("thePrefKey", "Some Default Text")); 
    } 

    protected void onResume() { 
     super.onResume(); 
     getPreferenceScreen().getSharedPreferences() 
       .registerOnSharedPreferenceChangeListener(this); 
    } 

    protected void onPause() { 
     super.onPause(); 
     getPreferenceScreen().getSharedPreferences() 
       .unregisterOnSharedPreferenceChangeListener(this); 
    } 

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
      String key) { 
     Preference pref = findPreference(key); 
     if (pref instanceof EditTextPreference) { 
      EditTextPreference etp = (EditTextPreference) pref; 
      pref.setSummary(etp.getText()); 
     } 
    } 
} 
+0

diddnt为我工作。摘要文本不会改变 – jonney 2013-06-03 16:58:33

+0

它正在为我工​​作。它只在值改变时才被触发。因此,如果您的设置已包含值,则需要预设onCreated摘要。SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); String email = sharedPreferences.getString(“prefUsername”,“NULL”); EditTextPreference prefUsername =(EditTextPreference)findPreference(“prefUsername”); prefUsername.setSummary(email); – yancyn 2013-10-08 07:31:46

+0

问题:为什么这个答案(和原始问题)投到“EditTextPreference”? 'setSummary'是'Preference'的一种方法。是否有特定的理由来施放?我只是想明白。 – 2013-11-01 19:26:02

7

这对我有效。

public class PrefsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener 
{ 
    private Preference pref; 
    private String summaryStr; 
    String prefixStr; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.prefs); 

     SharedPreferences sharedPref = getPreferenceScreen().getSharedPreferences(); 
     sharedPref.registerOnSharedPreferenceChangeListener(this);  
    } 

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) 
    { 
     //Get the current summary 
     pref = findPreference(key); 
     summaryStr = (String)pref.getSummary(); 

     //Get the user input data 
     prefixStr = sharedPreferences.getString(key, ""); 

     //Update the summary with user input data 
     pref.setSummary(summaryStr.concat(": [").concat(prefixStr).concat("]")); 
    } 
} 
1

我最常做的是:
1 - 做延伸我需要证明(1元的偏好型) 2种偏好的一个新的类 - 里面的代码,做适当的actiob显示更新汇总
3 - 参考这个类在RES/XML /的preferences.xml文件

让我SWO一个小例子,适合的EditTextPreference:

CLS_Prefs_Edit.java

/** 
* CLS_Prefs_Edit class 
* 
* This is the class that allows for a custom EditTextPrefence 
* (auto refresh summary). 
* 
* @category Custom Preference 
* @author  Luca Crisi ([email protected]) 
* @copyright Luca Crisi 
* @version  1.0 
*/ 
package com.your_name.your_app; 

/* -------------------------------- Imports --------------------------------- */ 

import android.content.Context; 
import android.preference.EditTextPreference; 
import android.util.AttributeSet; 

public final class CLS_Prefs_Edit 
extends EditTextPreference 
{ 

    /* ---------------------------- Constructors ---------------------------- */ 

    public CLS_Prefs_Edit(final Context ctx, final AttributeSet attrs) 
    { 
     super(ctx, attrs); 
    } 
    public CLS_Prefs_Edit(final Context ctx) 
    { 
     super(ctx); 
    } 

    /* ----------------------------- Overrides ------------------------------ */ 

    @Override 
    public void setText(final String value) 
    { 
     super.setText(value); 
     setSummary(getText()); 
    } 
} 

RES/XML /的preferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    > 
    <PreferenceCategory android:title="@string/pref_phone_cat"> 
<!-- NORMAL EditTextPreference, NO summary update --> 
<!--   <EditTextPreference --> 
<!--    android:widgetLayout="@layout/arr_dn" --> 
<!--    android:key="phone" --> 
<!--    android:title="@string/pref_phone_title" --> 
<!--    android:summary="@string/pref_phone_summ" --> 
<!--    android:defaultValue="" --> 
<!--    android:inputType="phone" --> 
<!--    android:digits="+1234567890" --> 
<!--   /> --> 
<!-- MY EditTextPreference, WITH summary update --> 
     <com.your_name.your_app.CLS_Prefs_Edit 
      android:widgetLayout="@layout/arr_dn" 
      android:key="phone" 
      android:title="@string/pref_phone_title" 
      android:summary="@string/pref_phone_summ" 
      android:defaultValue="" 
      android:inputType="phone" 
      android:digits="+1234567890" 
     /> 
    </PreferenceCategory> 
</PreferenceScreen> 

当然,在/ RES /价值/串设置你的字符串,就大功告成了。

请注意,此解决方案适用于PreferenceFragments和PreferenceActivities
我使用它在2.2 Froyo上运行的应用程序(显示PreferenceActivity)以及4.4 KitKat(显示PreferenceFragment)

我希望它有帮助。

+0

虽然这可行,但会在setText()和setSummary()调用之间引入不良依赖。例如,在调用setText()之后,android框架可以决定使用空字符串(从xml应用值)调用setSummary()。 – 2014-11-06 00:48:56