BottomSheetDialogFragment高仿抖音评论底部弹出框

BottomSheetDialogFragment高仿抖音评论底部弹出框

先看效果图:
在这里插入图片描述
这个弹窗的效果是使用BottomSheetDialogFragment做的,第一个弹出的对话框为CommentListDialogFragment ,第二个弹出的对话框为SendCommentDialogFragment,代码如下:

展示 CommentListDialogFragment


public class CommentListDialogFragment extends BottomSheetDialogFragment {
    private Dialog dialog;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NO_FRAME, R.style.DialogTheme);//给dialog设置主题为透明背景 不然会有默认的白色背景
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        dialog = super.onCreateDialog(savedInstanceState);
        dialog.setCanceledOnTouchOutside(true);//设置点击外部可消失
        Window win = dialog.getWindow();
        WindowManager.LayoutParams params = win.getAttributes();
        win.setSoftInputMode(params.SOFT_INPUT_ADJUST_NOTHING);//设置使软键盘弹出的时候dialog不会被顶起
        win.setWindowAnimations(R.style.Anim_Dialog_Bottom);//这里设置dialog的进出动画
        return dialog;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 在这里将view的高度设置为精确高度,即可屏蔽向上滑动不占全屏的手势。如果不设置高度的话 会默认向上滑动时dialog覆盖全屏
        View view = inflater.inflate(R.layout.list_dialog, container, false);
        view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                getScreenHeight(getActivity()) * 2 / 3));
        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        TextView postCommentText = view.findViewById(R.id.tv);
        RecyclerView recyclerView = view.findViewById(R.id.rv);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        ItemAdapter itemAdapter = new ItemAdapter();
        recyclerView.setAdapter(itemAdapter);
        postCommentText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //写评论的弹出框
                SendCommentDialogFragment dialogFragment = new SendCommentDialogFragment();
                dialogFragment.show(getFragmentManager(),dialogFragment.getClass().getName());
            }
        });

    }

    /**
     * 得到屏幕的高
     */
    public static int getScreenHeight(Context context) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        int height = wm.getDefaultDisplay().getHeight();
        return height;
    }

    @Override
    public void onStart() {
        super.onStart();
        final View view = getView();
        view.post(new Runnable() {
            @Override
            public void run() {
                View parent = (View) view.getParent();
                CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) (parent).getLayoutParams();
                CoordinatorLayout.Behavior behavior = params.getBehavior();
                BottomSheetBehavior mBottomSheetBehavior = (BottomSheetBehavior) behavior;
                mBottomSheetBehavior.setHideable(false);//禁止下拉取消弹框
                mBottomSheetBehavior.setPeekHeight(view.getMeasuredHeight());//让dialog的内容显示完整
            }
        });
    }





    public class ItemAdapter extends RecyclerView.Adapter {

        @NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return new ViewHolder(LayoutInflater.from(getContext()).inflate(R.layout.item_comment, parent, false));
        }

        @Override
        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
            TextView comment = holder.itemView.findViewById(R.id.comment);
            TextView name=holder.itemView.findViewById(R.id.name);
            name.setText("用户"+position+":");
            comment.setText("评论:" + position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public int getItemCount() {
            return 30;
        }


        class ViewHolder extends RecyclerView.ViewHolder {

            public ViewHolder(@NonNull View itemView) {
                super(itemView);

            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115

展示 SendCommentDialogFragment


public class SendCommentDialogFragment extends BottomSheetDialogFragment {

    private Dialog dialog;
    private int mLastDiff = 0;//键盘弹出过程中最后的高度值

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NO_FRAME, R.style.DialogTheme);//给dialog设置主题为透明背景 不然会有默认的白色背景
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        dialog = super.onCreateDialog(savedInstanceState);
        dialog.setCanceledOnTouchOutside(true);//设置点击外部可消失
        Window win = dialog.getWindow();
        WindowManager.LayoutParams params = win.getAttributes();
        win.setSoftInputMode(params.SOFT_INPUT_STATE_VISIBLE | params.SOFT_INPUT_ADJUST_RESIZE);//配置输入法,避免弹出遮挡布局
        win.setWindowAnimations(R.style.Anim_Dialog_Bottom);//这里设置dialog的进出动画
        return dialog;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_sendcomment, container, false);
        view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        //R.id.dialog_ly这里是根布局
        LinearLayout dialogLy = view.findViewById(R.id.dialog_ly);
        dialogLy.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View view, int i, int i1, int i2, int i3, int i4, int i5, int i6, int i7) {
                Rect r = new Rect();
                dialog.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);//获取当前界面可视部分
                int screenHeight = dialog.getWindow().getDecorView().getRootView().getHeight();//获取屏幕的高度
                int heightDifference = screenHeight - r.bottom;//此处就是用来获取键盘的高度的, 在键盘没有弹出的时候 此高度为0 键盘弹出的时候为一个正数
                if (heightDifference <= 0 && mLastDiff > 0) {
                    onDismiss(dialog);//手动关闭输入法时,对话框也跟着关闭
                }
                mLastDiff = heightDifference;
            }
        });
    }


    @Override
    public void onStart() {
        super.onStart();
        final View view = getView();
        view.post(new Runnable() {
            @Override
            public void run() {
                View parent = (View) view.getParent();
                CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) (parent).getLayoutParams();
                CoordinatorLayout.Behavior behavior = params.getBehavior();
                BottomSheetBehavior mBottomSheetBehavior = (BottomSheetBehavior) behavior;
                mBottomSheetBehavior.setHideable(false);//禁止下拉取消弹框
                mBottomSheetBehavior.setPeekHeight(view.getMeasuredHeight());//让内容显示完整
            }
        });
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

注意
在弹出(SendCommentDialogFragment)也就是第二个对话框的时候,部分的布局控件会被输入法给遮挡,解决办法就是在res/values/styles文件中找到该对话框的主题文件,然后配置输入法,像这样:

<style name="DialogTheme">
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowSoftInputMode">adjustResize</item>
</style>
  • 1
  • 2
  • 3
  • 4

加上这两句代码,布局就能正常地显示啦。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Uniapp是一款多终端开发架,可以方便地开发出同时支持iOS和Android等多个平台的应用程序。而高德地图是一款功能强大的地图应用,其中包含了地图展示、导航、搜索等多种功能,用户使用广泛。基于Uniapp架,我们可以进行高仿高德地图的开发。 首先,我们可以使用Uniapp架的跨平台特性,将高德地图的相关功能进行封装,并提供给多个平台的用户使用。通过使用Uniapp的H5页面技术,我们可以将地图展示功能嵌入到Web页面中,让用户可以通过浏览器直接访问,并实现高仿的效果。 其次,Uniapp架支持原生插件的集成,我们可以通过引入高德地图的原生SDK,并与Uniapp进行深度集成,实现更加强大的地图功能。比如,可以调用高德地图的导航接口,让用户实现实时导航的功能;也可以利用高德地图的搜索接口,实现地点搜索和周边设施查询的功能。 另外,Uniapp还提供了丰富的组件库和UI样式库,我们可以借助这些库来实现高仿高德地图的界面设计。比如,可以使用Uniapp的地图组件来展示地图,并通过自定义样式实现与高德地图相似的界面效果;也可以使用Uniapp的列表组件和搜索组件,实现高仿的地点搜索功能。 总之,借助Uniapp的跨平台特性和原生插件集成能力,我们可以很好地实现高德地图的高仿效果。同时,Uniapp的丰富组件库和UI样式库也能帮助我们设计出与高德地图相似的用户界面。通过这些功能的组合应用,我们可以开发出功能强大、用户体验优秀的高仿高德地图应用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修行者对666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值