提醒对话框
手机上的App极大地方便了人们的生活,很多业务只需用户拇指一点即可轻松办理,然而这也带来了一定的风险,因为有时候用户并非真的想这么做,只是不小心点了一下而已,如果App不做任何提示的话,继续吭哧吭哧兀自办完业务,比如转错钱了、误删资料了,往往令用户追悔莫及。所以对于部分关键业务,App为了避免用户的误操作,很有必要弹出消息对话框,提醒用户是否真的要进行此项操作。这个提醒对话框便是App开发常见的AlertDialog,说起这个AlertDialog,安卓开发者都有所耳闻,该对话框不外乎消息标题、消息内容、确定按钮、取消按钮这四个要素,使用Java编码显示提醒对话框,基本跟下面的示例代码大同小异:
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("尊敬的用户"); builder.setMessage("你真的要卸载我吗?"); builder.setPositiveButton("残忍卸载", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { tv_alert.setText("虽然依依不舍,但是只能离开了"); } }); builder.setNegativeButton("我再想想", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { tv_alert.setText("让我再陪你三百六十五个日夜"); } }); AlertDialog alert = builder.create(); alert.show();
显而易见上述代码非常冗长,特别是两个按钮的点击事件,又是匿名类又是函数重载,令人不堪卒读。尝试将以上Java代码转换为Kotlin代码,则改写后的Kotlin代码如下所示:
val builder = AlertDialog.Builder(this) builder.setTitle("尊敬的用户") builder.setMessage("你真的要卸载我吗?") builder.setPositiveButton("残忍卸载") { dialog, which -> tv_alert.text = "虽然依依不舍,还是只能离开了" } builder.setNegativeButton("我再想想") { dialog, which -> tv_alert.text = "让我再陪你三百六十五个日夜" } val alert = builder.create() alert.show()
这下看来点击事件的代码在很大程度上简化了,不过除此之外,整块代码依然显得有些臃肿,尤其是运用了建造者模式的Builder类,虽然表面上增强了安全性,但对于编码来说其实是累赘。因此,Anko库将其做了进一步的封装,给Context类添加了一个扩展函数,即“alert(消息内容, 消息标题) { 几个按钮及其点击事件 }”,简化后的alert弹窗代码举例如下:
alert("你真的要卸载我吗?", "尊敬的用户") { positiveButton("残忍卸载") { tv_alert.text = "虽然依依不舍,还是只能离开了" } negativeButton("我再想想") { tv_alert.text = "让我再陪你三百六十五个日夜" } }.show()
现在的Kotlin代码相比之下更方便阅读了,并且代码量还不到原来Java代码的三分之一。当然,为了正常地使用这么好的扩展函数,不要忘了在代码文件头部加上下面一行导入语句:
import org.jetbrains.anko.alert
这么精简的Kotlin代码,功能上可是一点都没偷工减料的,它的提醒对话框效果与Java编码一模一样,都如下图所示。
下拉选择框
对于某些固定值的条件选择,比如红绿蓝三原色选择其一,一月份到十二月份选择其中一个月份等等,这些情况在Android中用到了下拉框Spinner。界面上的Spinner控件一开始是个右侧带向下箭头的文本,点击该文本会弹出一个选择对话框,选中某一项之后,对话框消失,同时界面上的文本替换为刚才选中的文本内容。光看下拉框的功能其实挺简单的,可是若用Java代码实现的话,就得费一番功夫了,下面便是Spinner控件的调用代码例子:
private void initSpinner() { ArrayAdapter<String> starAdapter = new ArrayAdapter<String>(this, R.layout.item_select, starArray); starAdapter.setDropDownViewResource(R.layout.item_dropdown); Spinner sp = (Spinner) findViewById(R.id.sp_dialog); sp.setPrompt("请选择行星"); sp.setAdapter(starAdapter); sp.setSelection(0); sp.setOnItemSelectedListener(new MySelectedListener()); } private String[] starArray = {"水星", "金星", "地球", "火星", "木星", "土星"}; class MySelectedListener implements OnItemSelectedListener { public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Toast.makeText(SpinnerDialogActivity.this, "你选择的行星是"+starArray[arg2], Toast.LENGTH_LONG).show(); } public void onNothingSelected(AdapterView<?> arg0) {} }