Android自定义对话框提供用户输入选项
最近在写一个关于服务器站点性能量化评分的小功能,主要是根据Apdex公式来进行评判的,需要提供一个让用户自己设置最优响应时间门槛的值的选项。由于页面空间的限制,采取了通过弹出自定义对话框的形式来实现这一功能,具体实现如下:
Apdex详解http://blog.csdn.net/sunny_sailor/article/details/51240313
- 自定义布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/compare_edit_last_set"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:text="@string/compare_edit_default"/>
</LinearLayout>
<LinearLayout
android:layout_marginLeft="4dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/compare_edit_time"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="5"
android:hint="@string/compare_edit_set"
android:imeOptions="actionDone"
android:maxHeight="48dp"
android:minLines="1"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_alignBaseline="@id/compare_edit_time"
android:layout_marginRight="16dp"
android:layout_weight="1"
android:maxHeight="48dp"
android:text="@string/compare_edit_set_unit">
</TextView>
</LinearLayout>
</LinearLayout>
- 代码文件
/**
* 提供设置量化评分的T值对话框
*/
private void settingDialog(final Context context)
{
final SharedPreferences.Editor editor = mPreferences.edit();
LayoutInflater layoutInflater = LayoutInflater.from(context);
//获取自定义的视图
View editView = layoutInflater.inflate(R.layout.dialog_compare_edit,null);
//省略部分代码
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(getString(R.string.compare_edit_title));
//设置视图
builder.setView(editView);
//获取输入的值
final EditText eTime = (EditText)editView.findViewById(R.id.compare_edit_time);
builder.setPositiveButton(getString(R.string.button_ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(("").equals(eTime.getText().toString()))
{
Toast.makeText(context,getString(R.string.input_reminder),Toast.LENGTH_SHORT)
.show();
changeShowing(false,dialog);
}
else{
int time = Integer.valueOf(eTime.getText().toString());
if(time <1 || time > 100000)
{
Toast.makeText(context,getString(R.string.input_reminder),Toast.LENGTH_SHORT)
.show();
changeShowing(false,dialog);
}else{
//还原PositiveButton的关闭效果
changeShowing(true,dialog);
}
}
}
}).setNegativeButton(getString(R.string.button_cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//还原NegativeButton的关闭效果
changeShowing(true,dialog);
}
}).create().show();
}
/**
* mShowing是Dialog类的一个成员变量,在setPositiveButton中改变之后会影响setNegativeButton,
* 如点击“取消”按钮将不能关闭对话框,解决办法在“取消”的onClick事件中再改变mShowing的值
* @param isShow
* @param dialog
*/
private void changeShowing(boolean isShow,DialogInterface dialog){
//通过反射机制得到变量并改变变量的值
try {
Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, isShow);
} catch (Exception e) {
e.printStackTrace();
}
}
上面代码中的changeShowing方法仅仅适用于android.app.AlertDialog,如果使用的是v7包下的AlertDialog,则可以使用如下代码代替来达到输入数据不正确或为空时,点击按钮对话框不关闭的效果。
/**
* 提供设置量化评分的T值对话框
*/
private void settingDialog(final Context context)
{
LayoutInflater layoutInflater = LayoutInflater.from(context);
View editView = layoutInflater.inflate(R.layout.dialog_compare_edit,null);
TextView lastSetTimeText = (TextView)editView.findViewById(R.id.compare_edit_last_set);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(getString(R.string.compare_edit_title));
builder.setView(editView);
//获取输入的值
final EditText eTime = (EditText)editView.findViewById(R.id.compare_edit_time);
builder.setPositiveButton(getString(R.string.button_ok),null);//只设置文本,而不添加监听事件
builder.setNegativeButton(getString(R.string.button_cancel),null);//只设置文本,而不添加监听事件
final AlertDialog alertDialog = builder.create();
alertDialog.show();
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(("").equals(eTime.getText().toString()))
{
Toast.makeText(context,getString(R.string.input_reminder),Toast.LENGTH_SHORT)
.show();
}
else{
//do something
//关闭对话框
alertDialog.dismiss();
}
}
}
});
}