使用onCreateDialog创建Dialog,并且动态修改Dialog的信息

原创 2012年03月24日 16:37:32

在开发文件管理器的过程中遇到过这样的问题,因为文件管理器中同一级的所有文件的名字都是不同的,所以在对不同文件操作时希望可以提供给用户一些信息,让用户了解当前正在操作的文件是哪个文件。例如,用户想要对文件进行重命名,那我首先弹出一个Dialog,然后Dialog的标题是正在操作的文件名字,Dialog中提供一个EditText供用户输入新的名字。可是在测试过程中出现了这样的事情,当操作第一个文件时,显示的信息是正确的,然而当操作第二个文件时,显示的标题还是第一个文件的名字,之后无论你操作哪个文件,显示的都是第一个文件的名字。上网查了一些资料,解释说如果你使用onCreateDialog方法创建对话框,而又想动态地更新它显示的信息,那你必须重写onPrepareDialog方法,在这个方法中对Dialog的显示信息进行设置,并且你在onCreateDialog方法中对这些显示信息的设置不可以为空,否则在onPrepareDialog对这些显示信息进行重新设置不会生效。下面是一个简单的例子,仅供参考:

main.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/showinfo"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:text="@string/hello" />

</LinearLayout>


Dialog中使用的contentView布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="新名字"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/new_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

</LinearLayout>


主程序

package com.ygc;

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

public class DialogTestActivity extends Activity {
	/** Called when the activity is first created. */
	// 加载重命名输入框布局文件
	private LayoutInflater factory;
	// 重命名视图
	private View renameView;

	// 显示文本
	private TextView showInfo;

	// 用户输入新名字的输入框
	private EditText input;

	// 上下文信息
	private Context mContext;

	// 显示Dialog的ID
	private static final int SHOW_RENAME_DIALOG = 0;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		mContext = this;
		initUI();
	}

	@Override
	protected Dialog onCreateDialog(int id) {
		Dialog dialog;
		switch (id) {
		case SHOW_RENAME_DIALOG:
			dialog = new AlertDialog.Builder(mContext)
					.setTitle(showInfo.getText())
					.setView(renameView)
					.setPositiveButton("确定",
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {
									showInfo.setText(input.getText());

								}
							})
					.setNegativeButton("取消",
							new DialogInterface.OnClickListener() {

								public void onClick(DialogInterface dialog,
										int which) {

								}
							}).create();
			break;
		default:
			dialog = null;
		}

		return dialog;
	}

	@Override
	protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
		switch (id) {
		case SHOW_RENAME_DIALOG:
			dialog.setTitle(showInfo.getText());
			break;
		}
		super.onPrepareDialog(id, dialog, args);
	}

	/**
	 * 初始化控件
	 * */
	private void initUI() {
		factory = (LayoutInflater) mContext
				.getSystemService(LAYOUT_INFLATER_SERVICE);
		renameView = factory.inflate(R.layout.rename_layout, null);
		input = (EditText) renameView.findViewById(R.id.new_name);
		showInfo = (TextView) findViewById(R.id.showinfo);
		showInfo.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				showDialog(SHOW_RENAME_DIALOG);
			}
		});
	}
}

 

注意,创建Dialog使用的mContext必须是Activity的context而不能使用getApplicationContext(),否则会报如下错误:


onCreateDialog方法及示例

一个Dialog一直被创建及作为Activity的一部分显示的时候,一般情况下,你应该使用回调方法onCreateDialog(int)创建Dialog,当你使用这个方法的时候,Android系统会自...
  • aomandeshangxiao
  • aomandeshangxiao
  • 2012年02月22日 17:46
  • 22586

onCreateDialog创建Dialog,并且用showDialog(id)调用Dialog的信息

android中dialog可以直接调用builder来建立,但是有时候dialog很多的时候你可以用onCreateDialog(id) 把它们统一做好,在需要显示的时候调用 showDialog...
  • chenaini119
  • chenaini119
  • 2015年12月23日 14:14
  • 623

关于动态创建对话框以及动态创建控件

关于动态创建对话框的问题,网上也有不少相关的文章,但大多都是大同小异  主要的关键是:      请看下面的两种不同的动态创建对话框1.  CDialog Dlg;     Dlg.Create(ID...
  • caowei880123
  • caowei880123
  • 2010年09月16日 11:55
  • 5967

EasyUI动态创建、删除模态Dialog

1、前言一般EasyUI都是在一个界面实现模块的增删改查,对于部分业务场景需要考虑分开展现模块的增删改查界面,单一界面实现的优缺点如下: 优点:开发简单、开发速度快; 缺点:添加、修改等界面无法复...
  • liubinwyzbt
  • liubinwyzbt
  • 2016年05月14日 23:11
  • 4433

Dialog对话框,超简单自定义用法

1,效果图 2,xml 文件
  • vily_luky
  • vily_luky
  • 2017年12月27日 19:22
  • 22

论__AlertDialog自定义布局回调修改的正确方式

论__AlertDialog自定义布局回调修改的正确方式
  • Rozol
  • Rozol
  • 2015年12月31日 13:20
  • 981

android 动态设置横竖屏切换 控制dialog等布局文件加载的方法

android 中需要根据前一个activity的朝向去设置后面的一个activity,但是设置可能会在dialog时出现不能根据当前activity朝向来调用对应的资源文件。用这个方法你应该就能解决...
  • chniccs
  • chniccs
  • 2016年06月21日 23:34
  • 4119

Android 自定义Dialog,文字动态加载效果。

之前在技术问答上面看到一个提问 “加载中…” 后面三个点是动态的,这么一个效果实现。想来想去,好像没想到好的处理方式。 尝试了一下,以一个最笨的方式实现了。先来看一下效果 : 我是通过自...
  • lv_fq
  • lv_fq
  • 2016年06月26日 14:08
  • 4144

Android AlertDialog 动态更新弹出框中的内容

Android 的AlertDialog中的Message一旦设置,在Dialog弹出后,显示过程中,不能改变其中的Msg值,其中如果你使用mAlertDialog.setMessage(“New V...
  • Tovey19911011
  • Tovey19911011
  • 2014年09月26日 18:30
  • 8601

Create OnCreate OnInitialUpdate OnCreateClient 构造函数之间关系

1.OnCreate在OnCreateClient之前执行, 一些操作只能放在OnCreateClient中执行, 比如分割窗口。 只有当你想改变CCreateContext结构中的数值时才需重写(...
  • Sayesan
  • Sayesan
  • 2014年12月01日 14:08
  • 477
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用onCreateDialog创建Dialog,并且动态修改Dialog的信息
举报原因:
原因补充:

(最多只允许输入30个字)