現在、Androidアプリプロジェクトを使用してAndroidx名前空間に移行しています。ただし、名前空間だけが変更されているようです。DialogPreferenceについては、以前に使用していた一部のインターフェースがなくなっています。
たとえば、次のメソッドが不足しているようです:onBindDialogView、showDialog、onDialogClosed。
ダイアログのデフォルトの動作に影響を与えるためにこれらのメソッドのいくつかを使用しているため、この機能を今どのように実現する必要があるかは不明です。たとえば、ダイアログを閉じる前に入力を検証し、sharedpreferencesの代わりにデータベースに値を保存し、ダイアログに動的要素を追加しています。
他の誰かがすでにこの問題に遭遇し、解決策を見つけましたか?ドキュメントに何か見逃しましたか?私たちが使用できる/使用すべき別の概念はありますか?
DialogPreferenceの代わりにFragmentsを使用することは可能ですが、少量のコンテンツ(たとえば、ユーザーが選択できるツリーアイテムのリスト)の場合、これは多くのオーバーヘッドになるようです...
Androidxソースファイルから始めて、古いDialogPreferenceに基づくカスタムクラスを新しいandroidx.preference.DialogPreferenceに次の手順で移行しました。
レガシーDialogPreferenceに基づく古いカスタムダイアログクラス(CustomDialogPreferenceなど)は、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);
}
}
(私のような)_androidx.preference.DialogPreference
_と_androidx.preference.PreferenceDialogFragmentCompat
_を組み合わせる方法を完全に理解していないすべての人のための小さなハック:
ステップ1:
DialogFragment
のonAttach()
メソッドで、目的の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
を自分で処理する必要があるという違いだけで、同じ結果が得られます。