自定义一个退出AlertDialog(对话框)
2015-11-25 21:18
393 查看
遭遇揪心问题:
1、对话框难看,预览与实际运行结果严重不符。
2、对话框有黑角。
可能形成的原因:
1、对话框中的控件使用了包裹内容,于是 android 任性地自适应了,所以导致预览与结果相差较大,解决的办法是写死控件的大小。
2、对话框的xml根布局标签中,设置了背景,导致背景色被设为对话框的背景,由此显示出来。
关于AlertDialog:
1、弹出对话框后,屏幕自动变暗,此时整个屏幕存在一张全屏半透明的蒙版,遮挡了Activity的内容。
2、然后,对话框将xml布局的根标签的背景色添加到对话框的底层,大小为对话框大小,且为一个矩形。不设置时此层透明。
3、然后,将xml布局的子布局添到第2步矩形层的上方,此时,若此子layout的 background 没有充满该矩形,矩形就会显露出来。因此,可能导致黑角,黑背景的诞生,这取决于xml根标签的android background = “”属性。如果设为#00000000,即表示全透明,与不设置等同。前两位表示透明度,后6位是颜色。
问题图:
问题产生的原因如上所诉,仅仅是因为此对话框的xml文件多出了android:background=”#005566”用来设置背景:
dialog_exit.xml
解决问题后,上效果图:
所有代码:
MyAlerDialog.java
MainActivity.java
layout包下:
dialog_exit.xml
drawable 包下,没有则创建:
对话框的背景:
dialog_background.xml
按钮的背景:
background_ok_cancel.xml
ok,完成。运行模拟器,点击返回键即弹出退出对话框。
1、对话框难看,预览与实际运行结果严重不符。
2、对话框有黑角。
可能形成的原因:
1、对话框中的控件使用了包裹内容,于是 android 任性地自适应了,所以导致预览与结果相差较大,解决的办法是写死控件的大小。
2、对话框的xml根布局标签中,设置了背景,导致背景色被设为对话框的背景,由此显示出来。
关于AlertDialog:
1、弹出对话框后,屏幕自动变暗,此时整个屏幕存在一张全屏半透明的蒙版,遮挡了Activity的内容。
2、然后,对话框将xml布局的根标签的背景色添加到对话框的底层,大小为对话框大小,且为一个矩形。不设置时此层透明。
3、然后,将xml布局的子布局添到第2步矩形层的上方,此时,若此子layout的 background 没有充满该矩形,矩形就会显露出来。因此,可能导致黑角,黑背景的诞生,这取决于xml根标签的android background = “”属性。如果设为#00000000,即表示全透明,与不设置等同。前两位表示透明度,后6位是颜色。
问题图:
问题产生的原因如上所诉,仅仅是因为此对话框的xml文件多出了android:background=”#005566”用来设置背景:
dialog_exit.xml
[code]<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#005566" > …… </RelativeLayout>
[code]去掉此行代码即可。或者设为android:background="#00000000"
解决问题后,上效果图:
所有代码:
MyAlerDialog.java
[code] import android.app.AlertDialog; import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.Button; /** * 自定义的对话框 */ public class MyAlerDialog extends AlertDialog implements android.view.View.OnClickListener { private Button btn_ok,btn_cancel;//确定,取消 private Context context; public MyAlerDialog(Context context) { super(context); this.context = context; } /** * 布局中的其中一个组件 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 加载自定义的内容视图 setContentView(R.layout.dialog_exit); btn_ok = (Button) findViewById(R.id.btn_ok_dialog); btn_cancel = (Button)findViewById(R.id.btn_cancel_dialog); btn_ok.setOnClickListener(this); btn_cancel.setOnClickListener(this); } @Override public void onClick(View v) { if (v==btn_cancel) { dismiss();//取消对话框 } if(v==btn_ok){//关闭当前进程,退出程序 dismiss(); int pid = android.os.Process.myPid(); android.os.Process.killProcess(pid); //杀死当前进程...相当暴力 } } }
MainActivity.java
[code] import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; public class MainActivity extends Activity { //自定义的弹出框类 RoundSelectPopupWindow menuWindow; /* (non-Javadoc) * @see android.app.AlertDialog#onKeyDown(int, android.view.KeyEvent) * 可以监视键盘,返回键,home键 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode==KeyEvent.KEYCODE_BACK) { MyAlerDialog mydialog = new MyAlerDialog(MainActivity.this); mydialog.show(); } return super.onKeyDown(keyCode, event); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
layout包下:
dialog_exit.xml
[code]<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:layout_width="wrap_content" android:layout_height="150dp" android:layout_centerInParent="true" android:background="@drawable/dialog_background" > <TextView android:id="@+id/tv_text_in_top" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="25dp" android:textSize="20sp" android:text="退出" /> <TextView android:id="@+id/tv_text_in_center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="主人,真的要离开我么?" /> <LinearLayout android:id="@+id/layout_ok_cancel_dialog" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" > <Button android:id="@+id/btn_ok_dialog" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.0" android:background="@drawable/button_ok_cancel" android:text="确定" /> <Button android:id="@+id/btn_cancel_dialog" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1.0" android:background="@drawable/button_ok_cancel" android:text="取消" /> </LinearLayout> </RelativeLayout> </RelativeLayout>
drawable 包下,没有则创建:
对话框的背景:
dialog_background.xml
[code]<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#ff66aa"/> <corners android:radius="50dp"/> </shape>
按钮的背景:
background_ok_cancel.xml
[code]<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-- 填充暗橙*** --> <solid android:color="#ff8c00"/> <!-- 圆角 <corners android:radius="5dp"/> --> </shape>
ok,完成。运行模拟器,点击返回键即弹出退出对话框。
相关文章推荐
- Net开源工作流Roadflow的使用与集成
- 算法 之 栈的简单讲解
- 慕课网JavaScript编程练习
- NULL与空字符串的区别(以JAVA为例)
- 问题之~The following packages have unmet dependencies: openssh
- 神经网络(6)---一些神经网络学习复杂非线性问题的例子(2)
- phpstorm快捷键
- 可持久化线段树求区间第k大
- 基于Verilog HDL的有限状态机
- linux搭建ftp服务器
- [Web前端]梳理-DOM.1.
- 冒泡排序算法
- OC冒泡排序
- unity3D 实战 《小十传奇》系列之二:控制层(上)
- mysqld参数配置
- TCP/IP (三) TCP消息的接收
- CodeForces 545B Equidistant String
- 《leetCode》:Linked List Cycle II
- 新版本ADT创建Android项目无法自动生成R文件解决办法
- LightOJ 1042 Secret Origins