BottomSheetDialog在向下拖动后保持隐藏状态

大卫·塞鲁西(David Seroussi)

我对BottomSheetDialog关闭它的行为感到非常好奇:当用户将其向下拖动以隐藏它时,即使bottomSheetDialog#show()被调用,它也将保持隐藏状态这仅在将其向下拖动时发生,而不是在用户触摸外部或bottomSheetDialog#dismiss()以编程方式被调用时发生。

确实很烦人,因为我的bottomSheetDialog内部很大,里面有一个recyclerview,并且每次要显示时我都必须创建一个新视图bottomSheetDialog

因此,不只是这样做:

if(bottomSheetDialog != null){
   bottomSheetDialog.show();
else{
   createNewBottomSheetDialog();
}

我必须每次都创建一个。

我是否缺少某些东西?这是正常现象吗?(顺便说一句我用appcompat-v7:23.2.1

大卫·塞鲁西(David Seroussi)

因此,我最终设法通过直接查看BottomSheetDialog实现来解决了这个问题,我发现这不过是将简单的代码Dialog包装到常规代码中而已BottomSheet
问题出在BottomSheetCallBack

@Override
    public void onStateChanged(@NonNull View bottomSheet,
            @BottomSheetBehavior.State int newState) {
        if (newState == BottomSheetBehavior.STATE_HIDDEN) {
            dismiss();
        }
    }

当达到状态HIDDEN时会发生问题,而通过拖动该对话框来关闭该对话框时会发生这种情况。之后,即使bottomSheetDialog.show()被调用,对话框也保持隐藏状态我找到的最简单的解决方法是删除此状态,并用COLLAPSED状态替换它。

我创建了一个classCustomBottomSheetDialog,复制了整个BottomSheetDialog类,并添加了一行以解决该问题:

@Override
    public void onStateChanged(@NonNull View bottomSheet,
                               @BottomSheetBehavior.State int newState) {

        if (newState == CustomBottomSheetBehavior.STATE_HIDDEN) {

            dismiss();
            bottomSheetBehavior.setState(CustomBottomSheetBehavior.STATE_COLLAPSED);
        }
    }

这是最终代码:

public class CustomBottomSheetDialog extends AppCompatDialog {

    public CustomBottomSheetDialog (@NonNull Context context) {
        this(context, 0);
    }

    public CustomBottomSheetDialog (@NonNull Context context, @StyleRes int theme) {
        super(context, getThemeResId(context, theme));
        // We hide the title bar for any style configuration. Otherwise, there will be a gap
        // above the bottom sheet when it is expanded.
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
    }

    protected CustomBottomSheetDialog (@NonNull Context context, boolean cancelable,
            OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
    }

    @Override
    public void setContentView(@LayoutRes int layoutResId) {
        super.setContentView(wrapInBottomSheet(layoutResId, null, null));
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setLayout(
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    }

    @Override
    public void setContentView(View view) {
        super.setContentView(wrapInBottomSheet(0, view, null));
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        super.setContentView(wrapInBottomSheet(0, view, params));
    }

    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;
    }

    private boolean shouldWindowCloseOnTouchOutside() {
        if (Build.VERSION.SDK_INT < 11) {
            return true;
        }
        TypedValue value = new TypedValue();
        //noinspection SimplifiableIfStatement
        if (getContext().getTheme()
                .resolveAttribute(android.R.attr.windowCloseOnTouchOutside, value, true)) {
            return value.data != 0;
        }
        return false;
    }

    private static int getThemeResId(Context context, int themeId) {
        if (themeId == 0) {
            // If the provided theme is 0, then retrieve the dialogTheme from our theme
            TypedValue outValue = new TypedValue();
            if (context.getTheme().resolveAttribute(
                    R.attr.bottomSheetDialogTheme, outValue, true)) {
                themeId = outValue.resourceId;
            } else {
                // bottomSheetDialogTheme is not provided; we default to our light theme
                themeId = R.style.Theme_Design_Light_BottomSheetDialog;
            }
        }
        return themeId;
    }

    private BottomSheetBehavior.BottomSheetCallback mBottomSheetCallback
            = new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet,
                @BottomSheetBehavior.State int newState) {
            if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                dismiss();
                bottomSheetBehavior.setState(CustomBottomSheetBehavior.STATE_COLLAPSED);
            }
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        }
    };

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

淡出后保持隐藏

来自分类Dev

隐藏的div保持刷新状态

来自分类Dev

刷新后保持选择状态

来自分类Dev

刷新后保持崩溃状态

来自分类Dev

刷新后保持选择状态

来自分类Dev

即使在Android 10上处于隐藏状态,BottomSheetDialog仍在底部可见

来自分类Dev

向下拖动以关闭ViewController

来自分类Dev

向下拖动相对布局

来自分类Dev

Excel-如何在保持水平像元参考连续性的同时向下拖动公式

来自分类Dev

退出后,Android隐藏状态栏

来自分类Dev

ClickableSpan TextView在单击后保持选中状态

来自分类Dev

悬停后使CSS悬停状态保持不变

来自分类Dev

AngularJS。页面重新加载后保持状态

来自分类Dev

Servicestack RedisClient被处置后保持连接状态

来自分类Dev

更改后,RecyclerView不会保持修改状态

来自分类Dev

调用servlet后保持崩溃状态

来自分类Dev

测试后如何保持上次退出状态

来自分类Dev

Android CheckBox销毁后仍保持状态

来自分类Dev

在 onReceive 后保持 BroadcastReceiver 处于活动状态

来自分类Dev

AngularJS-即使文件被ng-if隐藏也保持选中状态

来自分类Dev

当elem隐藏时,Android webview':active'保持打开状态

来自分类Dev

图标保持隐藏状态,直到有东西移到那里

来自分类Dev

在片段之间切换并显示隐藏AlertDialog并保持状态

来自分类Dev

jQuery根据选择选项保持显示隐藏状态

来自分类Dev

如何隐藏滚动条并使内容保持可滚动状态?

来自分类Dev

如何在保持光标在css中向上或向下移动的同时隐藏滚动条

来自分类Dev

使用HTML5拖放,可以在保持拖动流程的同时从视图中隐藏元素

来自分类Dev

PHP:使用Nginx或apache重定向下载请求并保持会话状态

来自分类Dev

隐藏UICollectionViewCell拖动预览

Related 相关文章

热门标签

归档