【申明】:图片资源均来自网络
Paste_Image.png
在开发中我们会有这样的需求:弹出一个对话框,接受用户的输入信息,然后对用户的信息进行处理。
那么怎么解决此需求呢?
Android中有AlertDialog这样的一个控件可以给我们使用。
AlertDialog的用途##
首先了解一下AlertDialog:
--最直接的用途:弹出警告框,比如:用户使用时,手机未连接WiFi,用户推出当前程序,用户删除文件时:
Paste_Image.png
--第二种就是能接受用户输入的对话框,如图:
Paste_Image.pngPaste_Image.png
--由插图可以看出,dialog的样式可以由我们自己设计出各种各样的样子
如何使用##
-
AlertDialog.--这是Android developer关于AlertDialog的介绍。
-
Android prompt user input dialog example:
--这是一个输入框的例子:
http://www.mkyong.com/android/android-prompt-user-input-dialog-example/ -
Android alert dialog example
--这是一个警告框的例子
http://www.mkyong.com/android/android-alert-dialog-example/ -
这是来自stackOverflow的一个答案:关于Input text dialog Android
http://stackoverflow.com/questions/10903754/input-text-dialog-android
踩过的坑
- 在使用的时候,因为会使用好几个这样的输入对话框,为了具有扩展性同时减少MainActivity里的代码,所以我准备新建一个文件包,专门处理这样的对话框,比如先写一个BaseInputDialog,然后根据不同的需求扩展出不同的InputDialog。
- 那么经过我的实验,发现这样很难实现,因为输入信息的对话框不同意一般的警告时对话框:
--一般警告对话框是无需和用户进行信息的交互的,不要获取用户信息然后再给出响应,而是直接的调用系统的资源:比如跳转到链接WiFi的界面,跳转到短信界面。
--而输入对话框我需要拿到对话框的输入信息,比如一个EditText控件的内容,然后再将内容进行处理此时会使用到MainActivity的相关资源,即使使用回调等技巧也会很麻烦而且容易出错。
--另外每一个不同的输入对话框都会使用不同的xml文件作为布局都有不同的资源ID很难做到扩展性。 - 所以最后还是决定直接在MainActivity中输入对话框的代码编写,而不是重新建一个包和类。
对于以上问题有一个比较好的解法就是使用全局变量来获取用户输入数据,样例如下
<code>
builder.setView(view)
// Add action buttons
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
EditText et = (EditText)view.findViewById(R.id.GoalChooser); //这一行是获取Dialog中的EditText对象
Integer goalNumber = Integer.parseInt(et.getText().toString()); //将输入值转为int值
globalVariable = goalNumber; //这一行是精华。使用全局变量来保存获取用户输入的参数
Log.i("INFO",Integer.toString(goalNumber));
dialog.dismiss();
}
});
</code>
Null Object reference的异常
'android.text.Editable android.widget.EditText.getText()' on a null object reference
Getting value of EditText contained in a Custom Dialog Box
--链接为StackOverFlow上的解决办法
--当我们在MainActivity中使用:
EditText et = (EditText) findViewById(R.id.GoalChooser);这样是可以的,
但当我们使用Inflater从某一个XML文件中转为View然后再getViewById时需要这样做:
<code>View view = inflater.inflate(R.layout.goaldialog, null);
EditText et = (EditText)view.findViewById(R.id.GoalChooser);</code>
获取Input值处理时的坑
在我们处理EditText中的输入值时应该先对其进行非空检验”
<code>
EditText in = (EditText)view.findViewById(R.id.brightness_input_et);//01
if(!"".equals(in.getText().toString())&&in.getText().toString()!=null){ //02
Integer brightness = Integer.parseInt(in.getText().toString());//03
}
</code>
--以上三行代码:
- 注释01:获取EditText的控件
- 注释02: 这行代码有点长:获取了EditText控件的值,然后对其进行非空检验
- 注释03 :如果检验为非空,将我们获取的输入值进行转换处理
经常会忽视对其进行非空的检验而导致程序的Bug。
关注我学习更多技术哦
学习更多技术
网友评论