自定义AlertDialog实现下弹窗效果

本文展示了如何通过设置Window和Dialog主题,利用RecyclerView实现一个下拉效果的AlertDialog。详细代码已提供。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看下效果:




1,实现这个dialog其实最主要的是Window的设置和dialog的主题设置,list是由resycleView实现的,下面直接上代码:

private void initWindow() {
        View contentView = View.inflate(mContext, R.layout.layout_promotion_mapview_filter, null);
        setCanceledOnTouchOutside(true);
        setContentView(contentView);<span style="white-space:pre">	</span>//设置布局
        Window dialogWindow = getWindow();
        dialogWindow.getDecorView().setPadding(0, 0, 0, 0);
        dialogWindow.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        dialogWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        DisplayMetrics dm = new DisplayMetrics();
        dialogWindow.getWindowManager().getDefaultDisplay().getMetrics(dm);
        lp.width = dm.widthPixels;<span style="white-space:pre">	</span>//宽充满屏幕
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT; //高度自适应,根据我显示的list高度
        lp.gravity = Gravity.BOTTOM; //显示在界面的下方
        dialogWindow.setAttributes(lp);
        // Animation
//        dialogWindow.setWindowAnimations(R.style.main_menu_animstyle);
    }

2,启动的时候,可以传入相应的主题theme,theme决定了你dialog的显示样式,先上theme的代码:

<style name="filter_style" parent="android:style/Theme.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

3,启动的时候需要传入:

new PromotionMapViewFilter(getActivity(), R.style.filter_style);

4,构造函数里面就可以实现初始化了:

    public PromotionMapViewFilter(Context context, int themeResId){
        super(context, themeResId);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        .....
        this.show();  //一定注意这里,show要在initWindow之前执行,否则会报错!
        initWindow();<span style="white-space:pre">	</span>//代码在文章一开始
    }


注意这里有一个大坑,必须要在show()之后调用setContentView(),也就是必须在调用show()方法之后才能初始化布局,否则会报android.util.AndroidRuntimeException: requestFeature() must be called before adding content的错误,原因是在向Window里面添加布局View之前,Window布局格式必需确定,就是类似于requestWindowFeature(Window.FEATURE_NO_TITLE); 这样的设置,之后才能添加布局。因为setContentView()的时候会初始化PhoneWindow,此时,PhoneWindow的属性就会被确定,因此我们应在setContentView()之前设置PhoneWindow属性,之后再设置就会出错。同理show()方法是设置对话框属性的,因此pDialog.setContentView(msg, params);要放在show()之后。


以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值