Android学习——对话框Dialog

  1. 触摸监听和键盘监听
    给Activity添加触摸监听和键盘监听
@Override
    public boolean onTouchEvent(MotionEvent event) {
        //触摸监听,输出触摸点的坐标
        System.out.println(event.getX()+" "+event.getY());
        return super.onTouchEvent(event);
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //键盘监听,输出点击了按键的keyCode
System.out.println(keyCode + "  " + KeyEvent.keyCodeToString(keyCode));
        return super.onKeyDown(keyCode, event);
    }

运行后查看LogCat日志:
这里写图片描述
注意:键盘监听指的是物理键盘,对软件键盘无效,运行的时候只能捕捉到KEYCODE_MENU菜单键、KEYCODE_DEL删除键、KEYCODE_BACK返回键。
2. 自定义Toast通知

// 自定义Toast
            // 把一个布局转化为View
            View v = View.inflate(this, R.layout.toast, null);
            Toast toast = new Toast(this);
            toast.setView(v);
            toast.setDuration(0);
            toast.setGravity(Gravity.TOP | Gravity.RIGHT, 0, 50);
            toast.show();

3.对话框Dialog

3.1 AlertDialog
(1)样式一:
这里写图片描述

// 构建者模式 :把内容和表现分开
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 方法链builder.setCancelable(true).setIcon(R.drawable.ic_launcher).setMessage("xxxx")
.setTitle("AlertDialog测试").setPositiveButton("yes", new OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    MainActivity.this.finish();
                }
            }).setNegativeButton("cancle", new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                // dialog.cancel();
                }
            }).setNeutralButton("no", new OnClickListener() {
                        @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            }).create().show();

(2)样式二:
这里写图片描述

//选项列表样式对话框
//颜色选项字符串
final CharSequence[] items3 = { "Red", "Green", "Blue" };
//构建者
AlertDialog.Builder builder3 = new AlertDialog.Builder(this);           
builder3.setTitle("Pick a color");
//设置选项,并添加监听
builder3.setItems(items3, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
    // getApplicationContext()
    // MainActivity.this
    // 包含的信息多,但是注意引用不要传到其他activity,否则该activity无法释放
Toast.makeText(getApplicationContext(), items3[item], Toast.LENGTH_SHORT).show();
    }
});
//创建出AlertDialog对话框并显示
AlertDialog alert = builder3.create();
alert.show();

(3)样式三:
这里写图片描述

//单选选项列表对话框
//颜色选项字符串
final CharSequence[] items4 = { "Red", "Green", "Blue" };
//构建者
final AlertDialog.Builder builder4 = new AlertDialog.Builder(this);
builder4.setTitle("选择一种颜色");
//设置单选选项,并添加监听
builder4.setSingleChoiceItems(items4, -1, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
    Toast.makeText(MainActivity.this, items4[which], 0).show();
    }
});
//点击ok按钮后对话框消失
builder4.setPositiveButton("ok", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();                   
}
});
//创建出AlertDialog对话框并显示
AlertDialog alertDialog = builder4.create();
alertDialog.show();

**区别:**MainActivity.this包含的信息多,但是注意引用不要传到其他Activity,否则该activity无法释放;
getApplicationContext();有的情况下不能用。

3.2 进度对话框
(1)样式一:
这里写图片描述

//转圈进度条对话框
ProgressDialog d = ProgressDialog.show(this, "upload...", "xxxxxx");
//设置单击空白处可以取消对话框
d.setCancelable(true);

(2)样式二:
这里写图片描述

            //创建进水平度条对话框
            ProgressDialog pd = new ProgressDialog(this);
            //设置对话框标题
            pd.setTitle("正在下载文件xxx");
            //设置对话框图标
            pd.setIcon(R.drawable.ic_launcher);
            //设置进度条类型为水平
            pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            //设置对话框上显示内容
            pd.setMessage("已经下载了10%..");
            //设置单击空白处可以取消对话框
            pd.setCancelable(true);
            //设置最大进度为100
            pd.setMax(100);
            //设置当前进度为10
            pd.setProgress(10);
            //设置二级进度为20
            pd.setSecondaryProgress(20);
            //显示对话框
            pd.show();

3.3 自定义Dialog
自定义对话框:
这里写图片描述

//自定义对话框
Dialog myDialog = new Dialog(this);
//设置对话框标题
myDialog.setTitle("自定义对话框测试");
//把一个布局转化为View
//View view = View.inflate(this, R.layout.mydialog, null);
//设置自定义对话框的布局
myDialog.setContentView(R.layout.mydialog);
//获得自定义对话框上的Button,并添加监听
final Button btn = (Button) myDialog.findViewById(R.id.button1);
btn.setText("xxx");
btn.setOnClickListener(new View.OnClickListener() {             
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "点击了"+btn.getText(), 0).show();       
    }
});
//显示对话框
myDialog.show();

3.4 日期对话框DatePickerDialog
布局文件:

 <!--显示日期,初始值为当前日期-->
    <TextView
        android:id="@+id/tv_date"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:lines="3" 
        android:gravity="center"
        android:textColor="#0000FF"
        android:textSize="32sp"/>
    <!--单击按钮弹出日期对话框,并将改变后的日期显示在上面的TextView中-->
    <Button
        android:id="@+id/btn_change"
        android:layout_below="@id/tv_date"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:text="改变日期"/>

java实现代码:

//实现OnClickListener接口
public class MainActivity extends Activity implements OnClickListener{
    private TextView tv_date;
    private Button btn_change;
    private int year,month,day;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获得TextView,Button
        tv_date = (TextView) this.findViewById(R.id.tv_date);
        btn_change = (Button) this.findViewById(R.id.btn_change);
        //获得当前日期
        Calendar calendar = Calendar.getInstance();
        year = calendar.get(Calendar.YEAR);
        month = calendar.get(Calendar.MONTH);
        day = calendar.get(Calendar.DAY_OF_MONTH);
        //更新日期显示
        updateDisplay(year,month,day);
        //添加监听事件
        btn_change.setOnClickListener(this);
    }
    //自定义更新日期显示方法
    private void updateDisplay(int year, int month, int day) {
        StringBuilder sb = new StringBuilder();
        sb.append(year).append("-").append(month).append("-").append(day);
        tv_date.setText(sb);
    }
    @Override
    public void onClick(View v) {
        //日期选择对话框
        DatePickerDialog dpd = new DatePickerDialog(this, new OnDateSetListener() {         
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    //更新日期显示
    updateDisplay(year, monthOfYear, dayOfMonth);           
}
        }, year, month, day);
        dpd.show();//注意:一定记得show出来      
    }
}

运行:
这里写图片描述
点击“改变日期”按钮:
这里写图片描述

点击ok后日期改变。
区别: DatePickerDialog
DatePicker显示在界面中的

3.5 用线程模拟进度条
在布局文件中添加一个Button,当点击该按钮时,显示进度条对话框。
实现代码:

public class MainActivity extends Activity {
    private final int PROGRESSDIALOG = 1;
    private ProgressDialog progressDialog;
    private ProgressThread thread;
    //处理消息队列
    private Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            //从Message中获得参数以及对象
            int progess = msg.arg1;
            progressDialog = (ProgressDialog) msg.obj;
            //设置进度
            progressDialog.setProgress(progess);
            //当进度完成后,销毁进度对话框,并设置线程状态为PROGRESS_DONE停止子线程
            if(progess==100){
                progressDialog.dismiss();               
                thread.setProgressState(ProgressThread.PROGRESS_DONE);
            }
        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获得button对象,并添加监听
        Button button = (Button) this.findViewById(R.id.btn_create);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //显示进度对话框
                showDialog(PROGRESSDIALOG);
            }
        });

    }
    @Override
    protected Dialog onCreateDialog(int id) {
        // TODO Auto-generated method stub
        //此方法先执行,且只执行一次
        Toast.makeText(this, "onCreateDialog", 0).show();
        switch (id) {
        case PROGRESSDIALOG:
            progressDialog = new ProgressDialog(this); 
            //设置样式为水平进度条样式
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            //设置进度最大值为100
            progressDialog.setMax(100);
            //设置初始进度为 0
            progressDialog.setProgress(0);
            return progressDialog;

        default:
            return null;
        }

    }
    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        // TODO Auto-generated method stub
        //每次showDialog执行之前执行此方法,在onCreateDialog方法之后
        Toast.makeText(this, "onPrepareDialog", 0).show();
        progressDialog = (ProgressDialog) dialog;
        progressDialog.setProgress(0);
        //启动子线程
        thread = new ProgressThread(progressDialog);        
        thread.start();
        super.onPrepareDialog(id, dialog);
    }
    //定义子线程
    class ProgressThread extends Thread{
        //进度完成常量
        public static final int PROGRESS_DONE = 0;
        //进度运行常量
        public static final int PROGRESS_RUNNING =1;
        //进度状态变量
        private int progressState;
        //关联进度对话框
        private ProgressDialog progressDialog;
        public ProgressThread(ProgressDialog progressDialog) {
            this.progressState = PROGRESS_RUNNING;
            this.progressDialog = progressDialog;
        }
        //设置进程状态
        public void setProgressState(int progressState) {
            this.progressState = progressState;
        }

        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            int progress = 0;
            while(progressState == PROGRESS_RUNNING){
                SystemClock.sleep(100); 
                //获取当前进度并设置新的进度
                progress ++;
                //定义Message
                Message msg = new Message();
                //把当前进度变量保存到msg中
                msg.arg1 = progress;
                //把进度对话框保存到msg中,obj保存的是对象
                msg.obj = progressDialog;
                //将msg添加到消息队列
                handler.sendMessage(msg);
            }
        }
    }
}

运行:
这里写图片描述
点击按钮:
这里写图片描述
说明:
showDialog();显示Dialog
dismissDialog();//销毁Dialog
先执行onCreateDialog() :此方法只执行一次,以后再 showDialog的时候不再创建
再执行onPrepareDialog():每次show执行的时候先要执行此方法

注意:在UI线程或主线程中,不能使用长循环,或耗时操作,否则界面会卡死;
UI线程即主线程,事件处理在UI线程中,如果有耗时操作,应该写在子线程中;
界面本身是一个Activity对象,是非线程安全的,只能由主线程负责绘制,如果子线程也绘制,将会引起多线程安全,子线程负责长循环,如果数据发生改变,由主线程绘制。
消息队列
Handler handler = new Handler{
handlerMessage(…)
}
子线程:
SystemClock.sleep();//android中的,已经try catch处理了
Message msg = new Message();
msg.arg1 =i;
msg.obj = pd;//放对象
handler.sendMessage(msg);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值