21

Builderを使用し、カスタムビューを設定して、AlertDialogを作成しようとしています。onCreateDialog内のビューを膨らませようとすると、StackOverflowErrorが発生します。

onCreateDialogにループバックするまでのコードは次のとおりです。

@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle(R.string.enter_time);

    LinearLayout outerLayout = (LinearLayout) getLayoutInflater(savedInstanceState)
            .inflate(R.layout.time_entry_dialog, null);
    ...
}

そして、これがLogCatの出力です。

02-28 22:30:04.220: E/AndroidRuntime(4250): FATAL EXCEPTION: main
02-28 22:30:04.220: E/AndroidRuntime(4250): java.lang.StackOverflowError
02-28 22:30:04.220: E/AndroidRuntime(4250):     at android.app.Activity.getSystemService(Activity.java:4009)
02-28 22:30:04.220: E/AndroidRuntime(4250):     at android.view.LayoutInflater.from(LayoutInflater.java:210)
02-28 22:30:04.220: E/AndroidRuntime(4250):     at android.view.ContextThemeWrapper.getSystemService(ContextThemeWrapper.java:75)
02-28 22:30:04.220: E/AndroidRuntime(4250):     at com.android.internal.app.AlertController$AlertParams.<init>(AlertController.java:812)
02-28 22:30:04.220: E/AndroidRuntime(4250):     at android.app.AlertDialog$Builder.<init>(AlertDialog.java:374)
02-28 22:30:04.220: E/AndroidRuntime(4250):     at android.app.AlertDialog$Builder.<init>(AlertDialog.java:359)
02-28 22:30:04.220: E/AndroidRuntime(4250):     at com.sweatyreptile.chee.runtimetracker.TimeEntryDialogFragment.onCreateDialog(TimeEntryDialogFragment.java:18)
02-28 22:30:04.220: E/AndroidRuntime(4250):     at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295)
02-28 22:30:04.220: E/AndroidRuntime(4250):     at com.sweatyreptile.chee.runtimetracker.TimeEntryDialogFragment.onCreateDialog(TimeEntryDialogFragment.java:21)
02-28 22:30:04.220: E/AndroidRuntime(4250):     at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295)
02-28 22:30:04.220: E/AndroidRuntime(4250):     at com.sweatyreptile.chee.runtimetracker.TimeEntryDialogFragment.onCreateDialog(TimeEntryDialogFragment.java:21)
02-28 22:30:04.220: E/AndroidRuntime(4250):     at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295)
...etc

編集:DialogFragment.getLayoutInflater()のソースでこの行を見つけました:

mDialog = onCreateDialog(savedInstanceState);

したがって、無限再帰を発生させずにonCreateDialog内にLayoutInflatorを取得できない場合、カスタムAlertDialogのビューを拡張するにはどうすればよいですか?

4

3 に答える 3

34

問題が見つかった場合。DialogFragment.getLayoutInflater()にはへの呼び出しが含まれているため、内部からonCreateDialog()呼び出すと無限ループが作成されます。onCreateDialog()getLayoutInflater()

私はこの答えで解決策を見つけました:https ://stackoverflow.com/a/10585164/2020340

これが良い形かどうかはよくわかりませんが、実際にはそうではないようですが、交換しました

getLayoutInflater(savedInstanceState)

getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

編集:それらは同じです。詳細については、この回答を参照してください:https ://stackoverflow.com/a/20995083/2020340

于 2013-03-01T07:35:14.157 に答える
1

これはフラグメント1.2.3で修正されているようです:https ://developer.android.com/jetpack/androidx/releases/fragment#1.2.3 。

ただし、ドキュメントでは使用しているrequireActivity().getLayoutInflater()だけでgetLayoutInflaterはないため、まだ推奨されていない可能性があります。

于 2020-05-15T09:58:27.810 に答える
1

を使用する必要がありますLayoutInflater.from(getContext())

使用している場合は、viewbindings次のように呼び出すことができます。

binding = FragmentOtpDialogBinding.inflate(LayoutInflater.from(getContext()));

于 2020-08-15T08:09:03.487 に答える