分享

showDialog()、onPrepareDialog()和onCreateDialog()的关系

 博雅书屋lhs 2014-05-01
差了很多资料,研究了两天showDialog()、onPrepareDialog()和onCreateDialog()的关系,但都没有想明白,今晚看了Android的源代码才终于弄清楚这三者是什么关系......

----> showDialog()调用createDialog()和onPrepareDialog(),其中createDialog()调用onCreateDialog()。

项目源码:

package com.bn.ex2s;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Sample2_19_Activity extends Activity
{
    final int PROGRESS_DIALOG = 0;
    final int INCREASE = 0;
    final int MAX_COUNTER = 100;
   
    ProgressDialog pd;
    Handler hd;
   
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        Button bok = (Button) this.findViewById(R.id.Button01);
        bok.setOnClickListener
        (
            new OnClickListener()
            {
                @Override  
                public void onClick(View v)
                {
                    showDialog(PROGRESS_DIALOG);                   
                }
            }
        ); 
       
        hd = new Handler()
        {
            @Override
            public void handleMessage(Message msg)  //必须重写此方法,用于接收数据
            {
                super.handleMessage(msg);               
                switch(msg.what)
                {
                   case INCREASE:
                     pd.incrementProgressBy(1);//进度每次加1
                        if(pd.getProgress() >= MAX_COUNTER)
                        {
                            pd.dismiss();                                
                                             
                   break;
                }
            }
        };
    }
   
    @Override
    public Dialog onCreateDialog(int id)
    {
        switch(id)
        {
              case  PROGRESS_DIALOG:
                 pd = new ProgressDialog(this);
                 pd.setMax(MAX_COUNTER);//设置最大值
                 pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
                 pd.setTitle(R.string.title);//设置标题
                 pd.setCancelable(false);//设置进度对话框不能用回退按钮关闭    
                 Log.d("kkk", "kkk");
              break;
             
        return pd;
    
   
    @Override
    //每次弹出对话框时被回调以动态更新对话框内容的方法
    public void onPrepareDialog(int id, Dialog dialog)
    {
        super.onPrepareDialog(id, dialog);
           switch(id)
           {
          case  PROGRESS_DIALOG:
            pd.incrementProgressBy(-pd.getProgress());//对话框进度清零
            new Thread()
            {
                  public void run()
                  {
                    while(true)
                    {
                          hd.sendEmptyMessage(INCREASE);
                          if(pd.getProgress() >= MAX_COUNTER)
                          {
                              break;
                          }
                          try
                          {
                              Thread.sleep(40);
                          }
                          catch(Exception e)
                          {
                              e.printStackTrace();
                          }
                     }
                                 
             }.start();
          break;
        }
    }
      

==================================================================================================

Android SDK 源代码:

public final void showDialog(int id) {
        showDialog(id, null);
}

==================================================================================================

public final boolean showDialog(int id, Bundle args) {
        if (mManagedDialogs == null) {
            mManagedDialogs = new SparseArray<ManagedDialog>();
        }
        ManagedDialog md = mManagedDialogs.get(id);
        if (md == null) {
            md = new ManagedDialog();
            md.mDialog = createDialog(id, null, args);
            if (md.mDialog == null) {
                return false;
            }
            mManagedDialogs.put(id, md);
        }
       
        md.mArgs = args;
        onPrepareDialog(id, md.mDialog, args);
        md.mDialog.show();
        return true;
}

==================================================================================================

 private Dialog createDialog(Integer dialogId, Bundle state, Bundle args) {
        final Dialog dialog = onCreateDialog(dialogId, args);
        if (dialog == null) {
            return null;
        }
        dialog.dispatchOnCreate(state);
        return dialog;
}



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多