最近在开发安卓,遇到想自定义弹出提示框的宽度和高度。遂在网上搜了下,总结了这么几种方式。
方式一:系统默认样式。
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.youkuaiyun.com/fancylovejava/article/details/21617553
(1)通过重新设定dialog的位置
(2)获取屏幕大小,根据大小设置相应的百分比。
再通过 dialogWindow.setAttributes(lp); 来重新设定alertdialog的位置。
个人认为第二种思路好一些。