案例
对话提示框在平时经常用到,如下图:
当用户点击“取消”或“保存并选择图片”时是直接dismiss的,然而我现在需要对输入框中是否输入文字进行判断,来提示用户输入必要的文字,才能跳转到另一个activity进行图片选择
实现方法
需要温习的部分:java反射
//保持dialog不关闭的方法
private void keepDialogOpen(AlertDialog dialog) {
try {
java.lang.reflect.Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, false);
} catch (Exception e) {
e.printStackTrace();
}
}
//关闭dialog的方法
private void closeDialog(AlertDialog dialog) {
try {
java.lang.reflect.Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, true);
} catch (Exception e) {
e.printStackTrace();
}
}
解释:在程序运行过程中反射出dialog的是否在显示的状态字(boolen)mShowing(源码在Dialog类中),通过动态运行过程中改变它的状态来间接使界面无法关闭,下面看具体在调用过程中的实现
程序调用
private void saveFavoriteDialog()
{
LayoutInflater inflater = LayoutInflater.from(getActivity());
final View view = inflater.inflate(R.layout.favorite_add_dialog, null);
dialog = new AlertDialog.Builder(getActivity())
.setTitle(R.string.create_favorite)
.setIcon(android.R.drawable.ic_menu_save)
.setView(view)
.setPositiveButton(R.string.chose_photo,new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
favoriteName = (EditText) view.findViewById(R.id.favorite_name_tv);
String name = favoriteName.getText().toString().trim();
if(name.length() == 0)
{
//条件不符合时点击按钮不消失对话框,提示用户输入必要内容
keepDialogOpen((AlertDialog) dialog);
Toast.makeText(getActivity(), R.string.please_enter_favorite_name, Toast.LENGTH_SHORT).show();
}
else
{
//手动调用dismiss(),先取消对话框,这一步必须调用
dialog.dismiss();
Intent intent = new Intent(getActivity(), ChooseFavorite.class);
intent.putExtra(ChooseFavorite.KEY_FAVORITE_NAME, name);
startActivityForResult(intent, 0);
}
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
closeDialog((AlertDialog) dialog);
}
})
.show();
}
这个方法就是用来打开对话框,然后判断editText中的输入情况,再跳转到下一个activity。