web-dev-qa-db-ja.com

AndroidX前後のDialogPreferenceの違い

現在、Androidアプリプロジェクトを使用してAndroidx名前空間に移行しています。ただし、名前空間だけが変更されているようです。DialogPreferenceについては、以前に使用していた一部のインターフェースがなくなっています。

たとえば、次のメソッドが不足しているようです:onBindDialogView、showDialog、onDialogClosed。

ダイアログのデフォルトの動作に影響を与えるためにこれらのメソッドのいくつかを使用しているため、この機能を今どのように実現する必要があるかは不明です。たとえば、ダイアログを閉じる前に入力を検証し、sharedpreferencesの代わりにデータベースに値を保存し、ダイアログに動的要素を追加しています。

他の誰かがすでにこの問題に遭遇し、解決策を見つけましたか?ドキュメントに何か見逃しましたか?私たちが使用できる/使用すべき別の概念はありますか?

DialogPreferenceの代わりにFragmentsを使用することは可能ですが、少量のコンテンツ(たとえば、ユーザーが選択できるツリーアイテムのリスト)の場合、これは多くのオーバーヘッドになるようです...

17
little_planet

Androidxソースファイルから始めて、古いDialogPreferenceに基づくカスタムクラスを新しいandroidx.preference.DialogPreferenceに次の手順で移行しました。

ステップ1

レガシーDialogPreferenceに基づく古いカスタムダイアログクラス(CustomDialogPreferenceなど)は、2つの個別のクラスに分割する必要があります。

  1. 1つのクラス(CustomPreferenceなど)はandroidx.preference.DialogPreferenceを拡張し、設定処理(データ管理)に関連するコードのみを含みます。
  2. 別のクラス(CustomDialogなど)はandroidx.preference.PreferenceDialogFragmentCompatを拡張する必要があり、onDialogClosedを含むダイアログ処理(ユーザーインターフェイス)に関連するコードのみが含まれます。このクラスは、このクラスのインスタンスを返すために静的メソッドnewInstanceを公開する必要があります。

ステップ2

PreferenceFragmentCompatに基づく設定を処理するメインフラグメントでは、カスタムダイアログを表示するためにonDisplayPreferenceDialogメソッドをオーバーライドする必要があります。例:

    private static final String DIALOG_FRAGMENT_TAG = "CustomPreference";

    @Override
    public void onDisplayPreferenceDialog(Preference preference) {
        if (getFragmentManager().findFragmentByTag(DIALOG_FRAGMENT_TAG) != null) {
            return;
        }

        if (preference instanceof CustomPreference) {
            final DialogFragment f = CustomDialog.newInstance(preference.getKey());
            f.setTargetFragment(this, 0);
            f.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
        } else {
            super.onDisplayPreferenceDialog(preference);
        }
    }
18
Livio

(私のような)_androidx.preference.DialogPreference_と_androidx.preference.PreferenceDialogFragmentCompat_を組み合わせる方法を完全に理解していないすべての人のための小さなハック:

ステップ1:

DialogFragmentonAttach()メソッドで、目的のSharedPreferenceの値を取得し(newInstance()メソッドからキーを取得するか、内部でハードコアする)、保存します変数として。一方、SharedPreferenceを閉じる前に、DialogFragmentに新しい値を保存してください。これにより、「カスタム設定」が作成されました。

ステップ2:

空の_androidx.preference.DialogPreference_を作成し、PreferenceScreen内で使用します。次に、@ Livioの2番目のステップで説明されているように、それをDialogFragmentと組み合わせます。

_private static final String DIALOG_FRAGMENT_TAG = "CustomPreference";

@Override
public void onDisplayPreferenceDialog(Preference preference) {
    if (getFragmentManager().findFragmentByTag(DIALOG_FRAGMENT_TAG) != null) {
        return;
    }

    if (preference instanceof CustomPreference) {
        final DialogFragment f = CustomDialog.newInstance(preference.getKey());
        f.setTargetFragment(this, 0);
        f.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
    } else {
        super.onDisplayPreferenceDialog(preference);
    }
}
_

そうすることで、SharedPreferenceの内部でDialogFragmentを自分で処理する必要があるという違いだけで、同じ結果が得られます。

0
Androidz