dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
BottomSheetDialog d = (BottomSheetDialog) dialog;
FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
}
});
私はNullPointExceptionに会いましたd.findViewById(android.support.design.R.id.design_bottom_sheet)
がnullを返すため、BottomSheetBehavior.from(bottomSheet)
これは変です。 Android MonitorのWatchesにDEBUGモードのこのコード行を追加し、通常、Framelayoutを返すことがわかりました。
はここBottomSheetDialogでwrapInBottomSheet
のコードです:時々
private View wrapInBottomSheet(int layoutResId, View view, ViewGroup.LayoutParams params) {
final CoordinatorLayout coordinator = (CoordinatorLayout) View.inflate(getContext(),
R.layout.design_bottom_sheet_dialog, null);
if (layoutResId != 0 && view == null) {
view = getLayoutInflater().inflate(layoutResId, coordinator, false);
}
FrameLayout bottomSheet = (FrameLayout) coordinator.findViewById(R.id.design_bottom_sheet);
BottomSheetBehavior.from(bottomSheet).setBottomSheetCallback(mBottomSheetCallback);
if (params == null) {
bottomSheet.addView(view);
} else {
bottomSheet.addView(view, params);
}
// We treat the CoordinatorLayout as outside the dialog though it is technically inside
if (shouldWindowCloseOnTouchOutside()) {
coordinator.findViewById(R.id.touch_outside).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isShowing()) {
cancel();
}
}
});
}
return coordinator;
}
、私はR.id.design_bottom_sheet
がandroid.support.design.R.id.design_bottom_sheet
と等しくないことがわかりました。それらは異なるR.javaで異なる値を持ちます。
android.support.design.R.id.design_bottom_sheet
をR.id.design_bottom_sheet
に変更しました。
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
BottomSheetDialog d = (BottomSheetDialog) dialog;
FrameLayout bottomSheet = (FrameLayout) d.findViewById(R.id.design_bottom_sheet); // use R.java of current project
BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
}
});
これ以上NullPointExceptionはありません。
ありがとう、私はこの方法を試しました。'BottomSheetDialogFragment'をjanky(オープニングアニメーションのフレームをスキップしているように見える)にします。 編集:Android MarshmallowとKitKatのデバイスでこれをテストしました – user2560886
これは私にとっては完璧に機能します。スキップしない。ダイアログを返す以外に何かしていますか?私は良いアイデアを持つことができるようにあなたのコードであなたのポストを更新する場合は感謝します。 – efemoney
私はジャンクに気づいていない。うまく動作します。 – rpattabi