【问题标题】:setting initial summary of the preferences on Android 3.0+在 Android 3.0+ 上设置首选项的初始摘要
【发布时间】:2013-02-27 08:24:02
【问题描述】:

在下一个代码中有两个findpreference(key),第一个在onCreate() 中,它返回null,但第二个正确返回首选项。我需要第一个很好地初始化首选项摘要。我花了很多时间尝试不同的方法,阅读文档和谷歌搜索,但我没有找到方法,请帮助。

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() 之外工作。

【问题讨论】:

    标签: android settings android-preferences


    【解决方案1】:

    这是我的最终代码,以防其他人需要它,它运行良好:

    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
      }
    }
    

    【讨论】:

      【解决方案2】:

      它返回null,因为您的key 在您的第一个findPreference(key) 调用中是null

      在第二次调用中,key 作为参数传递给onSharedPreferenceChanged(),这就是它在那里工作的原因。

      当您正在寻找一个名为“pref_style”的键时,您可以为整个班级定义该名称(例如static final String PREF_STYLE_KEY = "pref_style"),然后在您的第一次呼叫中呼叫findPreference(PREF_STYLE_KEY),在您的if() 中呼叫key.equals(PREF_STYLE_KEY)声明。

      【讨论】:

      • 对不起,在我的代码中,我在这两种情况下都直接寻找“pref_style”而不是键,所以这不是问题。谢谢您的回答!在调试时,我可以在变量中看到对象 settingsFragment/mPreferenceManager 在活动生命周期中是如何为空的,直到刚刚调用 onSharedPreferenceChanged() 然后 settingsFragment/mPreferenceManager/mSharedPreferences 获得 sharedPrefereces 并且 findpreference() 运行良好。但我不知道该怎么做,因为它在 onSharedPreferenceChanged() 之外工作。
      • 这很奇怪,因为mPreferenceManager 是在PreferenceFragmentonCreate() 方法中初始化的。您是否尝试在settingsFragmentonCreate() 中设置摘要(然后进行调试)?顺便说一句,在您第一次打电话后,sharedPreferences 是从哪里来的?
      • 是的!解决方案是在 settingsFragment 的 onCreate() 中而不是在 Activity 的 onCreate() 中设置摘要。现在完美运行!谢谢你!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      相关资源
      最近更新 更多