2013-03-11 63 views
1

在下一個代碼中有兩個findpreference(key),第一個在onCreate(),它返回null,但第二個返回正確的偏好。我需要第一個很好的工作來初始化首選項摘要。我花了很多時間嘗試不同的方式,閱讀文檔和使用谷歌搜索,但我沒有找到方法,請幫助。設置Android 3.0+的偏好設置的初始摘要

public class Settings30Activity extends PreferenceActivity implements OnSharedPreferenceChangeListener { 

    protected SettingsFragment settingsFragment; 

    @SuppressLint("NewApi") 
    @TargetApi(11) 
    public static class SettingsFragment extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.preferences);    
     }    
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     settingsFragment = new SettingsFragment();  

    //findPreference 1 (returns null):   
     Preference stylePref=settingsFragment.findPreference("pref_style"); 
     stylePref.setSummary(sharedPreferences.getString(key, "")); 

    } 

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {  
    if (key.equals("pref_style")) { 
    //findPreference 2(returns the preference ok): 
     Preference stylePref=settingsFragment.findPreference("pref_style"); 
     stylePref.setSummary(sharedPreferences.getString(key, ""));    
    } 
} 

}

調試時,我可以在變量如何對象settingsFragment/mPreferenceManager是沿着活動的生命週期無效,直到onSharedPreferenceChanged()只是調用然後settingsFragment/mPreferenceManager/mSharedPreferences得到sharedPrefereces看到和findpreference()效果很好。但我不知道該怎麼辦,因爲它在onSharedPreferenceChanged()之外。

回答

1

它返回null因爲您的keynull在您的第一個findPreference(key)調用。

在第二個調用中,key作爲參數傳遞給onSharedPreferenceChanged(),這就是它在那裏工作的原因。

當你正在尋找一個名爲「pref_style」鍵,你可以定義名稱爲您的整個類(例如static final String PREF_STYLE_KEY = "pref_style"),然後調用你的第一個電話findPreference(PREF_STYLE_KEY)key.equals(PREF_STYLE_KEY)if()聲明。

+0

對不起,我的代碼我是直接找「pref_style」在這兩種情況下,而不是主要的,所以這是不事情。謝謝您的回答!在debbuging時,我可以在變量中看到對象settingsFragment/mPreferenceManager在活動生命週期中是如何爲空的,直到剛剛調用onSharedPreferenceChanged()時,settingsFragment/mPreferenceManager/mSharedPreferences獲得了sharedPrefereces和findpreference()的效果。但是我不知道該如何處理它在SharedPreferenceChanged()之外的作品。 – user23 2013-03-12 09:21:55

+1

這很奇怪,因爲'mPreferenceManager'是在'PreferenceFragment'的'onCreate()'方法中初始化的。你是否嘗試在'settingsFragment'的'onCreate()'中設置總結(然後調試)?順便說一句,你的第一個電話之後的'sharedPreferences'從哪裏來? – saschoar 2013-03-12 10:41:18

+0

是的!在settings的片段onCreate()中設置sumar而不是在Activity的onCreate()中是解決方案。現在完美!謝謝saschoar! – user23 2013-03-12 17:16:21

1

Here's我萬一別人最後的代碼需要它,它工作得很好:

public class Settings30Activity extends PreferenceActivity implements 
    On SharedPreferenceChangeListener { 

    protected SettingsFragment settingsFragment;  


@SuppressLint("NewApi") 
@TargetApi(11) 
public static class SettingsFragment extends PreferenceFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences);   
     setSummaries(); 
    }   

    @SuppressLint("NewApi") 
    public void setSummaries(){ 
     final SharedPreferences sh = getPreferenceManager().getSharedPreferences() ; 

     //Pref1 
     Preference stylePref = findPreference("pref_style"); 
     stylePref.setSummary(sh.getString("pref_style", "")); 

     //here the other preferences.. 
    } 
}//End fragment 

@SuppressLint("NewApi") 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    settingsFragment = new SettingsFragment(); 
    getFragmentManager().beginTransaction() 
      .replace(android.R.id.content, settingsFragment) 
      .commit(); 
} 

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {  

    if (key.equals("pref_style")) { 
     Preference pref = settingsFragment.findPreference(key); 
     // Set summary to be the user-description for the selected value 
     pref.setSummary(sharedPreferences.getString(key, ""));    
    } 
    //here the others preferences 
    } 
}