安卓弹出提示框的属性和自定义宽度和高度的疑问

最近在开发安卓,遇到想自定义弹出提示框的宽度和高度。遂在网上搜了下,总结了这么几种方式。

方式一:系统默认样式。

final AlertDialog alert_dlg=new AlertDialog.Builder(this)
                .setTitle("对话框")
                .setCancelable(true)
.setView(view,0,0,0,0);//去除边框
                .setItems(items, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                        case 0:// Local Image
                                Intent intent=new Intent(Intent.ACTION_GET_CONTENT);
                                intent.addCategory(Intent.CATEGORY_OPENABLE);
                                intent.setType("image/*");
                            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
                                startActivityForResult(intent,SELECT_PIC_KITKAT);
                            } else {
                                startActivityForResult(intent,IMAGE_REQUEST_CODE);
                            }
                            break;
                        case 1:// 拍照
                            Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                            // 判断存储卡是否可以用,可用进行存储
                            if (hasSdcard()) {
                                intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(image_file));
                                        /*Uri.fromFile(new File(Environment
                                                .getExternalStorageDirectory(),
                                                IMAGE_FILE_NAME)));*/   
                            }                   startActivityForResult(intentFromCapture,CAMERA_REQUEST_CODE);
                            break;
                        }
                    }
                })
                    .setNegativeButton("取消",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                dialog.dismiss();
                            }
                        }).show();

上面的case里面的内容是选择拍照还是从图库里面选择照片。hasSdcard(),fromFile()方法忽略后简版如下:

final AlertDialog alert_dlg=new AlertDialog.Builder(this)
                .setTitle("对话框")
                .setCancelable(true)
                .setItems(items, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                        case 0:// Local Image
                            break;
                        case 1:// 拍照                            
                            break;
                        }
                    }
                })
                    .setNegativeButton("取消",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                dialog.dismiss();
                            }
                        }).show();

这个只能用AlertDialog自带的setProperty()。

方式二:getWindow() layout.xml。

final AlertDialog alert_dlg=new AlertDialog.Builder(this)
                .setTitle("对话框")
                .setCancelable(true)
                .setItems(items, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                        case 0:// Local Image
                            break;
                        case 1:// 拍照                            
                            break;
                        }
                    }
                })
                    .setNegativeButton("取消",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                dialog.dismiss();
                            }
                        }).show();

        Window alert_win=alert_dlg.getWindow();
        alert_win.setContentView(R.layout.alertdlg_style);

这个是全局AlertDialog ,覆盖整个屏幕。

方式三:LayoutInflater View
这个可以与第二种合着用。

LayoutInflater layoutInflater = LayoutInflater.from(this);
View myLoginView = layoutInflater.inflate(R.layout.alertdlg_style, null);
final AlertDialog alert_dlg=new AlertDialog.Builder(this)
                ……
                        }).show();

网上有合着用的:

Window alert_win=alert_dlg.getWindow();
alert_win.setContentView(R.layout.alertdlg_style);
LayoutInflater layoutInflater = LayoutInflater.from(this);
View myLoginView = layoutInflater.inflate(R.layout.alertdlg_style, null);
TextView dialogMsg = (TextView) window.findViewById(R.id.alert_dialog_message);//从Window中findView
dialogMsg.setOnClickListener(new View.OnClickListener() {//设置监听 
    @Override
    public void onClick(View v) {
        MainActivity.this.finish();
        System.exit(0);
    }
});

方式四:WindowManager getAttributes
相对于第二种window,WindowManager专门管理window的状态,因此可玩性要更多些。

final AlertDialog alert_dlg=new AlertDialog.Builder(this)
                ……
                        }).show();
WindowManager.LayoutParams  lp= alert_dlg.getWindow().getAttributes();  
lp.width=350;//定义宽度  
lp.height=800;//定义高度  
alert_dlg.getWindow().setAttributes(lp);

以上方式要注意的地方:
(1)AlertDialog 的改变是自适应内部控件的。也就是说,内部控件的长宽等属性变化,AlertDialog 才会整体改变。比如在第四种里面,我设置:

lp.height=800;//定义高度

但是没反应,只是位置变了。

(2)AlertDialog 派生自Dialog。安卓window与Dialog的区别是,window是主窗口,Dialog是辅助窗口。从Dialog能用window的方法可知,Dialog也是派生自window的。

(3)我需要的是任意改变AlertDialog的宽、高以及形状等特性。从一般见到的应用看,AlertDialog 应该没有系统自带改变形状相关的api。宽、高也不知道如何任意设置。

目前就写到这,以后更新。


2015.9.1
最近看到一篇有关改变AlertDialog宽,高和位置的文章。
链接:http://blog.csdn.net/fancylovejava/article/details/21617553

(1)通过重新设定dialog的位置
(2)获取屏幕大小,根据大小设置相应的百分比。
再通过 dialogWindow.setAttributes(lp); 来重新设定alertdialog的位置。
个人认为第二种思路好一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值