Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 665|回复: 0

android dialog——普通对话框原理-  Android学习

[复制链接]

该用户从未签到

发表于 2011-10-24 14:33:57 | 显示全部楼层 |阅读模式
先看过效果图:

   
图1  输入框默认文字为"这是一个普通对话框。"  



图2     当点击"显示普通对话框"后,将弹出一个对话框


图3 点击图2中的对话框的确定按钮, 输入框里输入自己的内容

图4  点击图3中的“显示普通对话框”后弹出对话框
第一步:建立res/values/string.xml

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="app_name">普通对话框</string>

    <string name="button">显示普通对话框</string>

    <string name="title">普通对话框</string>

    <string name="ok">确定</string>

    <string name="message">这是一个普通对话框。</string>

</resources>
复制代码
第二步:建立res/layout/common_dialog_layout.xml 用来创建输入框和“显示普通对话框”按钮 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout

  xmlns:android="http://schemas.android.com/apk/res/android"

  androidrientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content" >

  <EditText android:id="@+id/editText"

          android:layout_width="fill_parent"

          android:layout_height="wrap_content"

          android:text="@string/message"/>

  <Button android:id="@+id/button"

          android:layout_width="fill_parent"

          android:layout_height="wrap_content"

          android:text="@string/button"

  />

</LinearLayout>
复制代码


第三步: 分析:
关于src/com/mycommondialog/activity/CommonDialogActivity.java
1.首先对“显示普通对话框”按钮进行事件监听,即当点击这个按钮后显示对话框

View.OnClickListener listener = new View.OnClickListener() {

        

        @Override

        public void onClick(View view) {

                showDialog(COMMON_DIALOG);

        }

};

button.setOnClickListener(listener);//对button事件监听
复制代码

这里showDialog(int)用来显示对话框的,是系统自带的方法,当点击button产生时间后,调用该方法,首先该方法会判断Activity是否保存了对话框对象
(1)如果未保存则调用onCreateDialog(int),然后再调用onPrepareDialog(int, Dialog)
(2)如果保存了对话框对象,则直接调用onPrepareDialog(int, Dialog),不会再去create,所以有时候当你再输入框里无论如何输入什么内容,对话框的内容都是第一次产生的。
2. Activity 未保存对话框对象,则会创建对话框,即调用onCreateDialog(int)

protected Dialog onCreateDialog(int id) {

        

        EditText editText = (EditText) findViewById(R.id.editText);

        switch(id) {

            case COMMON_DIALOG:

                    Builder builder = new AlertDialog.Builder(this);

                    builder.setIcon(R.drawable.dialog);

                    builder.setTitle(R.string.button);

                    builder.setMessage(editText.getText());

                    DialogInterface.OnClickListener listener =

                            new DialogInterface.OnClickListener() {

                                

                                @Override

                                public void onClick(DialogInterface dialog, int which) {

                                        removeDialog(COMMON_DIALOG);

                                }

                        };

                        builder.setPositiveButton(R.string.ok, listener);

                        dialog = builder.create();

                    break;

        }

        return dialog;

}
复制代码

需要new AlertDialog.Builder(this)用来存放Dialog的内容(如图标,标题和信息),this是针对此Activity的。
setPositiveButton表示中间的那个button按钮(一般情况下button有三个按钮,此处只显示中间的那个按钮)
removeDialog(int)是用来清除Activity保存下来的Dialog对象,如果不加removeDialog将会导致无论在对话框里输入什么内容,
弹出来的对话框始终都是第一次保留下来的,这里所以要加上它
3. 关于onPrepareDialog(int, Dialog), 每次点击“显示普通对话框”按钮都会去调用此方法。

    @Override

    protected void onPrepareDialog(int id, Dialog dialog) {

            dialog.show();

    }
复制代码
dialog.show()其实意义不大,加与不加系统都会调用show的,而且只显示一个对话框,dialog中iSSHowing()来判断是否该对话框正在显示了,为了验证可以将onPrepareDialog(int, Dialog)改成下面情况(只针对下列改动)
protected void onPrepareDialog(int id, Dialog dialog) {

        dialog.show();

        dialog.show();

        dialog.show();

        dialog.show();

        dialog.show();

        dialog.show();

}
复制代码



或者
protected void onPrepareDialog(int id, Dialog dialog) {



}
复制代码


结果dialog显示一个,而不会有多个对话框出现。
关于整个CommonDialogActivity代码如下(src/com/mycommondialog/activity/CommonDialogActivity.java)

package com.mycommondialog.activity;



import android.app.Activity;

import android.app.AlertDialog;

import android.app.Dialog;

import android.app.AlertDialog.Builder;

import android.content.DialogInterface;



import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;



/**

*

* @author jamesliu

*

*/

public class CommonDialogActivity extends Activity {

        final int COMMON_DIALOG = 1;



        private Dialog dialog = null;



        @Override

        public void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.common_dialog_layout);



                Button button = (Button) findViewById(R.id.button);

                View.OnClickListener listener = new View.OnClickListener() {



                        @Override

                        public void onClick(View view) {

                                showDialog(COMMON_DIALOG);

                        }

                };

                button.setOnClickListener(listener);

        }



        /*

         * 使用onCreateDialog(int)来管理对话框的状态,

         * 那么每次对话框被解除时,

         * 该对话框对象的状态会被Activity保存. 调用

         * removeDialog(int)将所有该对象的内部引用

         * 移除 如本程序那样,如果不加removeDialog,

         * 那么显示的是第一次的内容

         */

        @Override

        protected Dialog onCreateDialog(int id) {



                EditText editText = (EditText) findViewById(R.id.editText);

                switch (id) {

                case COMMON_DIALOG:

                        Builder builder = new AlertDialog.Builder(this);

                        builder.setIcon(R.drawable.dialog);

                        builder.setTitle(R.string.button);

                        builder.setMessage(editText.getText());

                        DialogInterface.OnClickListener listener =

                                new DialogInterface.OnClickListener() {



                                @Override

                                public void onClick(DialogInterface dialog, int which) {

                                        // 将此处移除后,无论怎么修改EditText内容

                                        // 每次点击显示普通对话框,总是第一次的内容

                                        // 如果想更新EditText内容就得加removeDialog

                                        removeDialog(COMMON_DIALOG);

                                }

                        };

                        builder.setPositiveButton(R.string.ok, listener);

                        dialog = builder.create();

                        break;

                default:

                        break;

                }

                Log.e("onCreateDialog", "onCreateDialog");

                return dialog;

        }

        

        @Override

        protected void onPrepareDialog(int id, Dialog dialog) {

                Log.e("onPrepareDialog", "onPrepareDialog");

        }

}
复制代码



最后贴出目录结构



CommonDialogDemo.rar (165.04 KB, 下载次数: 3)
回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 14:34:00 | 显示全部楼层

Re:android

为何没人回帖呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 11:20 , Processed in 0.314729 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表