在开发文件管理器的过程中遇到过这样的问题,因为文件管理器中同一级的所有文件的名字都是不同的,所以在对不同文件操作时希望可以提供给用户一些信息,让用户了解当前正在操作的文件是哪个文件。例如,用户想要对文件进行重命名,那我首先弹出一个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(),否则会报如下错误: