Android下关于Dialog的学习

随着工作的变动。最近又要开始捣鼓Android了。这几天正在集中学习,一边阅读项目源码一边学习各个Android Api。哎哎一下子往脑袋里塞这么多东西感觉快爆掉了。于是决定将自己的学习成果和心得记录下来,免得忘记了。

Dialog

先记录下dialog的学习吧。除了Dialog自己,Activity中有几个相关的方法。

onCreateDialog(int, Bundle) 第一次调用showDialog时由系统调用

onPrepareDialog(int, Dialog, Bundle) 第二次及以上调用showDialog时由系统调用

showDialog(int, Bundle) 当需要显示Dialog时在代码里调用。int参数会传入上两个函数中

dismissDialog(int) 当需要隐藏Dialog时调用。

removeDialog(int) 当需要移除Dialog时调用。

前两个函数调用顺序是: onCreateDialog-> onPrepareDialog

不幸的是Android 3.0以后这些方法已经不被推荐使用了。我因为项目代码里有用到,于是顺便也研究一下。之后要看看推荐使用的DialogFragment以及FragmentManager。

下面是简单的源码。

package lily.android.dialogtest;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.widget.TextView;
import android.content.DialogInterface;

public class AndroidDialogTestActivity extends Activity {
	
	//private TextView mTitleView = null;
	private int mClickCount = 0;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //mTitleView =  (TextView)findViewById(R.id.textView1);
        
        Button button = (Button)findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener(){
        	@Override
        	public void onClick(View v)
        	{
        		showDialog(mClickCount);
        	}
        });
    }
    
    /** Called when the dialog is first created. */
    @Override
    protected Dialog onCreateDialog(int id) {
    
    	Dialog dialog = null;
    	switch(id)
    	{
    		case 0:
    	    	mClickCount++;
    			dialog = new AlertDialog.Builder(this).setTitle("Fool Test")
					 .setMessage("You are a stupid guy aha~!")
					 .setPositiveButton("OK", new MyDialogListener()).create();
    			break;
    		case 1:
    	    	mClickCount++;
    			dialog = new AlertDialog.Builder(this).setTitle("Smart Test")
					 .setMessage("You are a not smart at all!")
					 .setPositiveButton("OK", new MyDialogListener()).create();
    			break;
    	}

    	return dialog;
    }
    
    /** Called when the dialog is called after created. */
    @Override
    protected void onPrepareDialog(int id, Dialog dialog){

    	//mTitleView.setText(mClickCount);
    	switch(id)
    	{
    		case 0:
    			((AlertDialog)dialog).setMessage("You are still a stupid guy aha~!" + mClickCount);
    			break;
    		case 1:
    			((AlertDialog)dialog).setMessage("You are  not smart at all aha~!" + mClickCount);
    			break;
    	}

    }
    
    
    private class MyDialogListener implements DialogInterface.OnClickListener{

		@Override
		public void onClick(DialogInterface dialog, int which)
		{
			dialog.dismiss();  
		}
    }
}


通过代码运行可以验证函数的调用顺序(上面是贴的是最终版,要验证顺序可以自己稍微修改下)。

今天有三个需要注意的地方:

1.注释的代码若取消注释会导致程序异常退出,原因是在显示Dialog时尝试更新activity的控件。看来是不允许这样干的了。具体原因还没探究。总之先记录一下。

2.showDialog(int)传入不同的值会导致调用对应的onCreateDialog。即

showDialog(0);

showDialog(0);会是这样的调用顺序(onCreateDialog->onPrepareDialog )->onPrepareDialog。而

showDialog(0);

showDialog(1);会是这样的调用顺序(onCreateDialog->onPrepareDialog )->(onCreateDialog->onPrepareDialog)。

3.AlertDialog是Dialog的一个常用子类。简单的使用方法如代码示例。也可以自定义继承自Dialog的消息框。

 http://hi.baidu.com/lck0502/blog/item/9029e709060aeaa22fddd474.html这一篇里也有详细的介绍。

你可能感兴趣的:(android,api,null,Class,dialog,button)