创建一个View对象,由View提供输入的控件和布局(一般我们通过LayoutInflater将xml布局文件转换成View对象)
创建一个Builder对象
将第一步创建的View对象设置到Builder中。
创建按钮和设置回调函数
根据之前配置的Builder生成Dialog对象
调用Dialog.show()将生成的Dialog显示出来
所以我们先创建xml布局文件,这个布局最终会放到Dialog中。prompt_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/promptmessage"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:layout_marginLeft="20dip" android:layout_marginRight="20dip"
android:text="请在这里输入信息:" android:gravity="left"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText android:id="@+id/editText_prompt"
android:layout_height="wrap_content" android:layout_width="fill_parent"
android:layout_marginLeft="20dip" android:layout_marginRight="20dip"
android:scrollHorizontally="true" android:autoText="false"
android:capitalize="none" android:gravity="fill_horizontal"
android:textAppearance="?android:attr/textAppearanceMedium" />
- </LinearLayout>
然后将这个xml布局文件转换成View:
LayoutInflater li = LayoutInflater.from(this);
View view = li.inflate(R.layout.prompt_view, null);
将View放到Builder中,设置按钮和回调函数,然后调用builder的create方法创建Dialog对象并将这个dialog显示出来。
public void onShowPromptDialog(View v){
//inflate需要显示到Dialog里的View对象
LayoutInflater li = LayoutInflater.from(this);
View view = li.inflate(R.layout.prompt_view, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("prompt测试");
builder.setIcon(R.drawable.icon);
//之前inflate的View 放到dialog中
builder.setView(view);
builder.setPositiveButton("确定", this);
builder.setNegativeButton("取消", this);
builder.show();
}
这边我们设置回调方法由Activity代理处理,所以Activity需要implements DialogInterface.onClickListener
public class DemoDialog extends Activity implements DialogInterface.OnClickListener {
}
然后为Activity添加未实现的onClick方法:
@Override
public void onClick(DialogInterface dialog, int which) {
if(which == Dialog.BUTTON_POSITIVE){
AlertDialog ad = (AlertDialog) dialog;
EditText t = (EditText) ad.findViewById(R.id.editText_prompt);
Toast.makeText(this, t.getText().toString(), Toast.LENGTH_LONG)
.show();
}
}
这边我们做的处理是:判断Dialog中被点击的是否是确定按钮,如果是则从dialog中查找提供输入的View控件(EditText),然后获取用户填写的内容用Toast显示出来。onClick方法会将当前被点击的Dialog当成第一个参数,然后点击的按钮id当成第二个参数调用回调函数,由于第一个参数的类型所有Dialog的基类接口DialogInterface所以需要强制转换成AlertDialog对象才可以将View查找出来,第二个参数按钮ID,则会有三种值,因为AlertDialog最多可以有3个按钮,Dialog类中提供了对于这3个按钮对应的静态变量值,所以可以通过将button id和这3个静态变量值比较来获得用户点击的是哪个按钮。
在Android中使用PromptDialog有个需要注意的地方是,因为Android中Dialog都是异步模式,所以你无法在将Dialog显示出来后马上就查找Dialog中的输入框,然后获取输入值,因为这时候用户才看到输入框并没有填入值,所以获取输入值,并进行后续处理必须写在回调方法里。