1

私は Android アプリに PreferenceActivty を持っています。これは互換性の理由から、getPreferenceScreen() メソッドとコードで作成するいくつかの Preference オブジェクト (主に CheckBoxPreference と SwitchPreference) を介して使用します。

私のアプリの以前のバージョンまでは、合計で 8 つの設定があり、すべて正常に機能していましたが、今ではさらに 2 つの設定を追加したところ、非常に奇妙な問題が発生しています。

画面の 2 番目の設定は、SwitchPreference です。アクティビティを開くと、チェックされています。実際に何も変更せずに画面を下にスクロールすると、突然その値が自動的にオフに設定されます。OnChangeListener を Preference に追加して OnSharedPreferenceChangeListener を実装しようとしましたが、結果は同じです。特定の Preference が画面から消えると、オフになります。OFF に設定すると、その値が保持され、変更リスナーは呼び出されません。

なぜこれが起こっているのか、誰にも分かりますか?私は完全に迷っています...

前もって感謝します!


私の好みのコードは基本的にこれで、onCreate メソッドで 5 つの異なる設定に対して 5 回繰り返されます。

controlWifiPreference = new CheckBoxPreference(this);
controlWifiPreference.setKey(Constants.PREF_1_KEY);
getPreferenceScreen().addPreference(controlWifiPreference);

wifiPreference = new SwitchPreference(this);
wifiPreference.setKey(Constants.PREF_2_KEY);
getPreferenceScreen().addPreference(wifiPreference);

設定は TabActivity 内にあるため、onResume メソッドですべての設定に対して setChecked() を呼び出して値を再度設定しますが、それが完全に必要かどうかはわかりません。

最後に、 setDependency メソッドを機能させることができなかったため、他の人がクリックされたときに設定をアクティブ化/非アクティブ化する onSharedPreferenceChanged メソッドがあります。これは次のようなものです (繰り返しますが、5 回繰り返します)。

if (key.equals(controlWifiPreference.getKey())) {
    wifiPreference.setEnabled(controlWifiPreference.isChecked());
}
4

2 に答える 2

3

これは、SwitchPreference クラスの Android バグであることが判明しました。誰か (とても感謝しています ;)) が b.android.com に報告し、回避策を投稿してくれました。すべてここにあります: https://code.google.com/p/android/issues/detail?id=26194

于 2013-06-09T09:55:05.710 に答える
0

TabActivity内でプリファレンスを実装した方法通常のフォームアイテムとその値を手動で設定に保存します。テストしたコードとその動作は次のとおりです。

public class PreferencesFromCode extends PreferenceActivityimplements OnSharedPreferenceChangeListener{

private SwitchPreference switchPref;
private CheckBoxPreference checkboxPref;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setPreferenceScreen(createPreferenceHierarchy());
}

private PreferenceScreen createPreferenceHierarchy() {
    // Root
    @SuppressWarnings("deprecation")
    PreferenceScreen root = getPreferenceManager().createPreferenceScreen(
            this);

    // Inline preferences
    PreferenceCategory inlinePrefCat = new PreferenceCategory(this);
    inlinePrefCat.setTitle(R.string.inline_preferences);
    root.addPreference(inlinePrefCat);

    // Checkbox preference
    checkboxPref = new CheckBoxPreference(this);
    checkboxPref.setKey("checkbox_preference");
    checkboxPref.setTitle(R.string.title_checkbox_preference);
    checkboxPref.setSummary(R.string.summary_checkbox_preference);
    inlinePrefCat.addPreference(checkboxPref);

    // Switch preference
    switchPref = new SwitchPreference(this);
    switchPref.setKey("switch_preference");
    switchPref.setTitle(R.string.title_switch_preference);
    switchPref.setSummary(R.string.summary_switch_preference);
    inlinePrefCat.addPreference(switchPref);

    /*
     * The Preferences screenPref serves as a screen break (similar to page
     * break in word processing). Like for other preference types, we assign
     * a key here so that it is able to save and restore its instance state.
     */
    // Screen preference
    PreferenceScreen screenPref = getPreferenceManager()
            .createPreferenceScreen(this);
    screenPref.setKey("screen_preference");
    screenPref.setTitle(R.string.title_screen_preference);
    screenPref.setSummary(R.string.summary_screen_preference);

    return root;
}

@Override
protected void onResume() {
    super.onResume();
    PreferenceManager.getDefaultSharedPreferences(this)
            .registerOnSharedPreferenceChangeListener(this);
    /*
     * getPreferenceScreen().getSharedPreferences()
     * .registerOnSharedPreferenceChangeListener(this);
     */

}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
    Log.i("ghjg", "changed key is : " + key);
    if (key.equals(checkboxPref.getKey())) {
        switchPref.setEnabled(checkboxPref.isChecked());
    }
}
}

ただし、オーバーライドonContentChanged()して何が起こるかを確認できます。

于 2013-03-09T16:32:05.560 に答える