将BottomSheetDialogFragment的状态设置为展开 [英] Set state of BottomSheetDialogFragment to expanded
问题描述
如何设置使用 BottomSheetBehavior#setState(STATE_EXPANDED)
扩展 BottomSheetDialogFragment
的片段的状态Android支持设计库(v23.2.1)?
How do you set the state of a fragment extending BottomSheetDialogFragment
to expanded using BottomSheetBehavior#setState(STATE_EXPANDED)
using the Android Support Design Library (v23.2.1)?
https://code.google.com/p/android/issues/detail?id=202396 说:
首先将底页设置为STATE_COLLAPSED。如果要扩展它,请调用BottomSheetBehavior#setState(STATE_EXPANDED)。请注意,您不能在视图布局之前调用该方法。
Bottom sheets are set to STATE_COLLAPSED at first. Call BottomSheetBehavior#setState(STATE_EXPANDED) if you want to expand it. Note that you cannot call the method before view layouts.
建议的练习要求先放大视图,但我不确定如何设置将BottomSheetBehaviour放到一个片段上( BottomSheetDialogFragment
)。
The suggested practice requires a view to be inflated first, but I'm not sure how I'll set the BottomSheetBehaviour onto a fragment (BottomSheetDialogFragment
).
View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);
BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
推荐答案
无法在视图布局之前调用该方法。
"Note that you cannot call the method before view layouts."
上面的文字就是线索。
对话框具有一个监听器,一旦显示,该监听器便被触发。
Dialogs have a listener that is fired once the dialog is shown. The dialog cannot be shown if it isn't laid out.
因此,在您的 onCreateDialog()
中,该对话框无法显示。模态底部工作表( BottomSheetFragment
),在返回对话框之前(或者在引用对话框后,在任何位置),调用:
So, in the onCreateDialog()
of your modal bottom sheet (BottomSheetFragment
), just before returning the dialog (or anywhere, once you have a reference to the dialog), call:
// This listener's onShow is fired when the dialog is shown
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
// In a previous life I used this method to get handles to the positive and negative buttons
// of a dialog in order to change their Typeface. Good ol' days.
BottomSheetDialog d = (BottomSheetDialog) dialog;
// This is gotten directly from the source of BottomSheetDialog
// in the wrapInBottomSheet() method
FrameLayout bottomSheet = (FrameLayout) d.findViewById(android.support.design.R.id.design_bottom_sheet);
// Right here!
BottomSheetBehavior.from(bottomSheet)
.setState(BottomSheetBehavior.STATE_EXPANDED);
}
});
就我而言,我的自定义 BottomSheet
In my case, my custom BottomSheet
turned out to be:
@SuppressWarnings("ConstantConditions")
public class ShareBottomSheetFragment extends AppCompatDialogFragment {
@NonNull @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
BottomSheetDialog dialog =
new BottomSheetDialog(getActivity(), R.style.Haute_Dialog_ShareImage);
dialog.setContentView(R.layout.dialog_share_image);
dialog.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
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);
}
});
SwitchCompat switchview = (SwitchCompat) dialog.findViewById(R.id.switchview);
switchview.setTypeface(FontCache.get(dialog.getContext(), lookup(muli, NORMAL)));
return dialog;
}
}
让我知道是否有帮助。
更新
请注意,您也可以覆盖 BottomSheetDialogFragment
as:
Note that you can also override BottomSheetDialogFragment
as:
public class SimpleInitiallyExpandedBottomSheetFragment extends BottomSheetDialogFragment {
@NonNull @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);
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);
}
});
// Do something with your dialog like setContentView() or whatever
return dialog;
}
}
但我真的不明白为什么有人愿意这样做作为基础 BottomSheetFragment
除了返回 BottomSheetDialog
之外不做任何事情。
But I really dont see why anyone would want to do that as the base BottomSheetFragment
doesn't do anything other than return a BottomSheetDialog
.
ANDROIDX更新
使用AndroidX时,以前在 android.support上找到的资源.design.R.id.design_bottom_sheet
现在可以在 com.google.android.material.R.id.design_bottom_sheet
中找到。
When using AndroidX, the resource previously found at android.support.design.R.id.design_bottom_sheet
can now be found at com.google.android.material.R.id.design_bottom_sheet
.
这篇关于将BottomSheetDialogFragment的状态设置为展开的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!