1

次のコードには2つfindpreference(key)あり、最初のコードはinでonCreate()あり、nullを返しますが、2番目のコードは設定を正しく返します。設定の要約を初期化するために最初にうまく機能する必要があります。私はさまざまな方法を試したり、ドキュメントを読んだり、グーグルで検索したりすることに多くの時間を費やしてきましたが、方法が見つかりませんでした。助けてください。

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がアクティビティのライフサイクルに沿ってnullであることが変数で確認できます。onSharedPreferenceChanged()呼び出されるまで、settingsFragment / mPreferenceManager / mSharedPreferencesはsharedPreferecesを取得し、正常にfindpreference()機能します。しかし、それが外で機能するための方法がわかりませんonSharedPreferenceChanged()

4

2 に答える 2

1

あなたが最初の電話に出てnullいるので、それは戻ります。keynullfindPreference(key)

2番目の呼び出しでkeyは、がパラメーターとしてに渡されるためonSharedPreferenceChanged()、そこで機能します。

「pref_style」という名前のキーを探しているので、クラス全体(たとえばstatic final String PREF_STYLE_KEY = "pref_style")にその名前を定義してfindPreference(PREF_STYLE_KEY)から、最初の呼び出しとステートメントkey.equals(PREF_STYLE_KEY)で呼び出すことができます。if()

于 2013-03-12T00:31:43.167 に答える
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
  }
}
于 2013-03-12T17:25:10.803 に答える