`
xuyuanshuaaa
  • 浏览: 388422 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

android 对话框

阅读更多
当Activity需要临时显示一些信息或者提供一些功能,而创建一个activity又开销太大时,可以考虑一个Dialog
对话框和菜单一样 都是通过activity统一管理的,
1    @Override//回调方法
    protected Dialog onCreateDialog (int id) {
        switch (id) {
        case DIALOG_WELCOME:
            return new AlertDialog.Builder(ex10.this)
                .setIcon(android.R.drawable.ic_dialog_info)
                //内部图片类 android.R.drawable.*
                .setTitle("欢迎")
                .setMessage("欢迎使用本程序!")
                .setPositiveButton("确定",new OnClickListener() {
                    
                    public void onClick(DialogInterface arg0, int arg1) {
                        // 单击确定按钮做的事情。
                    }
                    
                })
                .create();
        default:
            return null;
        }

实现oncreateDialog方法,通过showDialog(int id)传进来的id进行对话框调用返回相应的对话框。
AlertDialog  是最简单的警告对话框。

2   日期选择和时间选择对话框  DatePickerDialog和TimePickerDialog
protected Dialog onCreateDialog (int id) {
        switch (id) {
        case DIALOG_DATEPICKER:
            return new DatePickerDialog(this,
                    new OnDateSetListener() {
                       
                        public void onDateSet(DatePicker v, int y,
                                int m, int d) {
                            /*
                             * 这是设置好日期后的回调函数,
                             * 可以根据设置的内容更新用户界面
                             * 或者系统时间。
                             */
                        }
                     }, c.get(Calendar.YEAR),
                    c.get(Calendar.MONTH), 
                    c.get(Calendar.DAY_OF_MONTH));   
        default:
            return null;
        }
    }

通过showDialog调用。Calender  获取当前日期

3  ProgressDialog  进度框,当在后台进行比较耗时的操作时采用比较好,往往配合handler一起使用。handler就是这种作用
public class ex12 extends Activity {
    ProgressDialog pd;
    Message msg;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //显示Dialog对话框
        showDialog(0);
        //使用handler把线程加入到线程队列中,由于此队列当前为空,所以threadr立即执行
        // 此处handler和runnable是对等的,handler里德handlermessage()和sendMessage()方法是对等的。
        pHandler.post(threadr);
    }
    //匿名内部类
    Handler pHandler = new Handler()
    {
    	public void handleMessage(Message msg)
    	{
    		pd.incrementProgressBy(msg.arg1);
    		pHandler.post(threadr);
    	}
    };
    //匿名内部类
    Runnable threadr =new Runnable(){
    	int i=0;
    	public void run()
    	{
    		i+=1;
    		msg=pHandler.obtainMessage();
    		//使用message的arg1和arg2参数传递消息,系统性能消耗小。
    		msg.arg1=i;
    		if (pd.getProgress() >= 100) {
                /*进度条满了后取消对话框*/
                pd.dismiss();
                //剔除线程
                pHandler.removeCallbacks(threadr);
            } else {
                /*进度条增加一格*/
            	try{
            		Thread.sleep(1000);
            	}
            	catch(Exception e)
            	{
            		e.printStackTrace();
            	}
                pHandler.sendMessage(msg);
            }
    	}
    };   
    @Override
    protected Dialog onCreateDialog (int id) {
            pd = new ProgressDialog(this);
            pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            /*设置进度条格数*/
            pd.setMax(MAXPROGRESS);
            pd.setProgress(0);
            return pd;
    }
}

在新建的线程中发送消息
handler.sendMessage(handler.obtainMessage());
•作为发送消息的参数
handler.sendMessage(handler.obtainMessage());
很容易handler在此过程中,在管理着一切的消息——由他发送,由他接收,由他处理。倘若不叫他管家,如何又说的过去呢。的确,我暗服Android设计师的构思(这只是其强大之一瞥,例如其他在MVC上的封装等),然而从面向对象的角度理解,似乎一切都那么的顺理成章,正如上面所说的,Handler对象就是我们所听过了的对象——管家。

细细说来,handler与线程是分不开的,即handler必附着于一个线程,它正是此线程的管家,它负责处理该线程内所有的消息。

对事件和消息的理解
谈上文正到酣处,却已发现handler已经赤裸裸的呈现在了我的面前,它的神秘面纱已被掀开。正说到消息,顿觉有必要研究研究管家的管理对象,还有其余“事件”的那些事儿。

打个比方:管家正在主人院子里巡视,观察着所有到院里来的热光声电。这时,有人来敲门,这是“事件”,敲门声(信息)传到管家耳中,这是接受消息,去开门时处理消息。从计算机角度说,事件是用户发起的,消息是系统发起的,并由程序处理之。至于消息处理的具体细节,荐:了解回调函数
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics