3

2 つの設定 xml ファイルがあります。最初のもの (pref2.xml) には、2 つの設定が含まれています。

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

   <CheckBoxPreference 
        android:key="key"
        android:title="title" 
        android:defaultValue="false"
    />
   <CheckBoxPreference 
        android:key="key2"
        android:title="title" 
        android:defaultValue="false"
    />
 </PreferenceScreen>

もう 1 つ (pref1.xml) には 1 つの設定が含まれています。

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

   <CheckBoxPreference 
        android:key="key"
        android:title="title" 
        android:defaultValue="false"
    />

 </PreferenceScreen>

私の好みの活動で、私はそれらを変更しようとしています:

    public void onCreate(Bundle savedInstanceState) {       
            super.onCreate(savedInstanceState);   

            addPreferencesFromResource(R.xml.pref1);
            this.getPreferenceScreen().removeAll();
            addPreferencesFromResource(R.xml.pref2);
            final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
            Log.d("LOG", "size of sharedPreferences"+adapter.getCount()+"(should be 2)");

実際、ここで正しい出力が得られ、すべてが正しく表示されます。しかし、1つの設定に関して表示された設定を変更したい。したがって、設定アクティビティに OnSharedPreferenceChangeListener を実装しました。

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    super.onSharedPreferenceChanged(sharedPreferences, key);

    //switch the widget type
    if (key.equals("key")){
        this.getPreferenceScreen().removeAll();
                    addPreferencesFromResource(R.xml.pref1);
                    final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
                    Log.d("LOG", "size of sharedPreferences "+adapter.getCount()+" (should be 1)");
    }
 }

まあ、pref1 設定は正しく表示されますが、出力は

「sharedPreferences 2 のサイズ」

バックグラウンドで古い設定がまだ適用されていることを示しました。listAdapter を反復処理すると、古い設定も取得されます。

どうすればこれを解決できますか?

listadapter がいくらか時代遅れであることがわかりました。getPreferenceScreen().getPreferenceCount() を介してアイテムの数を取得すると、適切な量が得られます。しかし、どうすればこれらの設定にアクセスできますか?

4

2 に答える 2

0

編集:まあ、正しくありませんでした:S

...

わかりました、私はついに解決策を見つけました。PreferenceScreen を変更した後、手動で listView を再度バインドする必要があります。

 getPreferenceScreen().bind((ListView)findViewById(android.R.id.list));
于 2012-05-11T11:12:13.663 に答える
0

問題は、異なる画面にあるにもかかわらず、「キー」のキーを持つ2つの設定があることにあると確信しています。設定はそのキーによって識別され、競合を避けるためにこれは一意である必要があります。リスナーは、キーからどの設定が変更されているかだけを知っています。キーを一意の値に変更します。

于 2012-05-11T07:48:36.380 に答える