1

次のように、xml ファイルで設定を定義しました。

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
    android:title="@string/pref_screen"
    android:key="pref_screen_key">

    <CheckBoxPreference
        android:defaultValue="true"
        android:key="prefs1_key"
        android:title="@string/prefs1_str"
        android:summary="@string/prefs1_summary" />
        ....

PreferenceActivity 内で、「pref_screen_key」の onPreferenceClick() をオーバーライドします。

     ...
     findPreference("pref_screen_key").setOnPreferenceClickListener(
     new OnPreferenceClickListener() {

     @Override
     public boolean onPreferenceClick(Preference preference) {
         if (flag) {
              // do some stuff
              return true; // According to Android doc it means, that click was handled
          } else
              return false;
     }

したがって、フラグが true の場合、Android が CheckBoxPreference でビューを開かないことを望みますが、自分のものを実行するだけです (onPreferenceClick() 内で true を返し、クリックが処理されたことを示し、デフォルトの onPreferenceClick() 動作を実行する必要はありません) )。残念ながら、Android は常に onPreferenceClick() をデフォルトの動作で処理し、同時に自分のものを作成します。

Androidのバグですか?ユーザーが PreferenceScreen をクリックした後に Android が CheckBoxPreference を表示しないようにする方法はありますか?

4

3 に答える 3

1

flag内でアクセスするには、 を final として宣言する必要があるという事実に問題が発生している可能性がありますOnPreferenceClickListener。それをクラスにカプセル化し、クラス final を宣言してみてください。

あなたの質問にもっと直接的に答えるためにonPreferenceClick()、あなたが から true を返すとき、あなたはシステムに「心配しないでください、私はそれを処理しました」と言っていることを覚えておいてください。したがって、実際には何もせずに単純に true を返す場合、システムはそれ自体を無視しているのではなく、Preferenceクリックされたときに何もしないように指示しただけです。

コードは、この例の 108 ~ 115 行のようになります。それを見て、それが役立つかもしれません。

于 2012-06-05T16:34:38.740 に答える
0

バグはhttps://github.com/android/platform_frameworks_base/blob/android-5.1.1_r13/core/java/android/preference/Preference.java#L985にあります

Preference.performClick では、isEnabled() が true かどうかを確認し、onClick() を呼び出してから、リスナーを呼び出し、false を返す場合は戻ります。そうでない場合は、処理を続行し、クリックを正しいツリー/画面/指定されたアクティビティを開始します。 .

バグは、onPreferenceClick の前に onClick を呼び出すため、onPreferenceClick が何を返しても、たとえばチェックボックスが常に切り替えられることです。

回避策: 残念ながら、すべての設定をサブクラス化し、独自のリスナー ディスパッチを行い、許可されている場合にのみ super.onClick() を呼び出す必要があります。

于 2015-09-02T15:46:53.150 に答える
0

setOnPreferenceClickListener の代わりに setOnPreferenceChangeListener を使用したいと思います。アンドロイドのドキュメントに従って:

これは、Preference の状態が更新される前、および状態が永続化される前に呼び出されます。

戻る:

Preference の状態を新しい値で更新する場合は True。

例:

Preference pref = findPreference("pref_key");
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
  @Override
  public boolean onPreferenceChange(Preference preference, Object newValue) {
    if (flag) {
      // do some stuff
      return false; // Pref change will be not be persisted.
    } else {
      return true;
    }
  }
});
于 2016-11-07T02:28:00.453 に答える