我们再写dialog的时候,会时常有这样一种需求,希望通过某些条件将dialog的button设置为disable的。

基本的命令就是将“确定”这个button设置为disable(false).

如下的方法,就是构造一个自定义的dialog,其中包括一个编辑栏(EditText)和两个按钮(确定和取消)

如果想要当EditText为空的时候让确定按钮为不可点击状态  你可能会如下实现(但是这个里面有问题!!!)。

public Dialog customDialog(Context dialogContext){
final AlertDialog.Builder builder = new AlertDialog.Builder(dialogContext);
builder.setView(editText); //将一个EditText放入dialog
builder.setTitle(R.string.fastdialer_add_number_title); //设置dialog的Title
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//点击确定后干点什么......
}
});
//希望拿到“确定”按钮。初始化确定按钮
final Button positiveButton = ((AlertDialog)dialog).getButton(AlertDialog.BUTTON_POSITIVE);
if(edittext.getText().toString.equal("")) //初次进来为空的时候,就设置按钮为不可点击
positiveButton.setEnabled(false);
editText.addTextChangedListener(//设置编辑栏的文字输入监听
new TextWatcher(){
@Override
public void afterTextChanged(Editable arg0) {
if(arg0.toString().equals("")){ //当编辑栏为空的时候,将按钮设置为不可点击。
positiveButton.setEnabled(false);
} else {
positiveButton.setEnabled(true);
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
}
);
return dialog; //返回dialog 由外层去dialog.show();
}

以上的这段代码编译是可以通过的,但是运行的时候,你会得到一个空指针异常。你猜的出来是哪个对象为空了么?

坑爹阿  就是

final Button positiveButton = ((AlertDialog)dialog).getButton(AlertDialog.BUTTON_POSITIVE);

另外如果想要判断editText的字符串是不是为空,应该editText.getText().toString().equal("");一定要toString().

否则这个判断会有问题。

所以请记住结论如下:

如果你想得到一个alertDialog中的button你必须在这个dialog.show()之后才能够拿到。

所以以上的代码可以更改为

private void createCustomDialog(Context dialogContext, final int position, String defaultNumber) {
final EditText editText = new EditText(dialogContext);
final AlertDialog.Builder builder = new AlertDialog.Builder(dialogContext);
builder.setView(editText);
builder.setTitle(R.string.fastdialer_add_number_title);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
//任何你想做的事情
}); builder.setNegativeButton(android.R.string.cancel, null);
Dialog dialog = builder.create();
dialog.show();//!!!!!!!!!!!!!!看这里,先把dialog show出来。
final Button positiveButton = ((AlertDialog)dialog).getButton(AlertDialog.BUTTON_POSITIVE);
//现在这个dialog的button不会再是空的了!!!!!!!!!!!
if(editText!=null && editText.getText().toString().equals(""))
positiveButton.setEnabled(false);
customType.addTextChangedListener(
new TextWatcher(){ @Override
public void afterTextChanged(Editable arg0) {
if(arg0.toString().equals("")){
positiveButton.setEnabled(false);
} else {
positiveButton.setEnabled(true);
}
}
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
}
);
}

以上代码是不是完美了呢?

其实dialog里面还有一个监听方法,可以当dialog show出来之后回调

所以你可以把要在show()之后做的事情放在这个监听方法里面,如下:

final Dialog dialog = builder.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener(){//开始监听 show
private Button positiveButton;
@Override
public void onShow(DialogInterface arg0) {
if(positiveButton == null)//先初始化相关的按钮
positiveButton = ((AlertDialog)arg0).getButton(AlertDialog.BUTTON_POSITIVE);
if(customType != null&&customType.getText().toString().equals("")){//判断编辑栏,记得要toString().
positiveButton.setEnabled(false);
} else {
positiveButton.setEnabled(true);
}
}});
customType.addTextChangedListener(new TextWatcher() {
private Button positiveButton;
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {} public void afterTextChanged(Editable arg0) {
if(positiveButton == null) {//此时dialog已经show出来了 所以应该也可以拿到按钮对象。
positiveButton = ((AlertDialog)dialog).getButton(AlertDialog.BUTTON_POSITIVE);
}
String content = arg0.toString();
if(content == null || content.equals("")) {
positiveButton.setEnabled(false);
} else {
positiveButton.setEnabled(true);
}
}
});

如果想让某一个button 高亮显示

dlg.setOnShowListener(new OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
Button positiveButton = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
// positiveButton.setFocusable(true); 之所以注释掉是因为没用
positiveButton.setFocusableInTouchMode(true); // 这个属性置为true后才有用
positiveButton.requestFocus();
}
});

dialog中的button动态设置为disable[转]的更多相关文章

  1. 利用StateListDrawable给button动态设置背景

    项目中,遇到相同样式的Button,只是stroke颜色不一样.为了实现一个,就得写两个shape文件,一个selector文件:多个还得重复写. 解决方法: 结合StateListDrawable给 ...

  2. 【原创】如何在Android中为TextView动态设置drawableLeft等

    如何在Android中为TextView动态设置drawableLeft等   两种方式:   方式1:手动设置固有边界 Drawable drawable = getResources().getD ...

  3. iOS-UITextField中给placeholder动态设置颜色的四种方法

    思路分析: 0.自定义UITextField 1.设置占位文字的颜色找-->placeholderColor,结果发现UITextField没有提供这个属性 2.在storyboard/xib中 ...

  4. DataSet中的表动态设置主键外键的方法

    原文发布时间为:2008-08-01 -- 来源于本人的百度文章 [由搬家工具导入] protected void pk_Click(object sender, EventArgs e)    {  ...

  5. vue中动态设置echarts画布大小

    document.getElementById('news-shopPagechart').style.height = this.heightpx2+'px'; //heightpx2定义在data ...

  6. 【Android】TextView动态设置android:drawableLeft|Right|Top|Bottom,SetColor

    Android中有时需动态设置控件四周的drawble图片,这个时候就需要调用 setCompoundDrawables(left, top, right, bottom),四个参数类型都是drawa ...

  7. Android Button 按钮 设置 各种状态 图片 颜色

    有2个方法可以实现,一种是用 选择器 定义每种状态的图片 selec.xml <?xml version="1.0" encoding="utf-8"?& ...

  8. siverlight 后台动态设置图片路径的总结

    最近碰到了个问题,需要给一个用户控件中的image动态设置图片资源 1.图片资源属性为resource时,静态引用无任何问题,但是动态设置时,就什么也不显示 后来找到问题所在, 必须把此图片属性项中“ ...

  9. Ext.form.Label组件动态设置html值

    解决方法: (1)用的是 Ext.getCmp(id).setText('XXXX')可以动态设置label 显示的文本值,但是文本中有个别数字需要改变颜色显示,需要加样式,这种方法会把加样式的标签( ...

随机推荐

  1. SQL读取系统时间的语法(转)

    --获取当前日期(如:yyyymmdd) select CONVERT (nvarchar(12),GETDATE(),112) --获取当前日期(如:yyyymmdd hh:MM:ss)select ...

  2. 编程小计——消除Graphics图像边缘颜色不纯(抗锯齿)

    在很多时候,我们都要绘制纯色的图片,而用Graphics生成的往往是不纯的,尤其是绘制文字时.比如说绘制纯红色文字,往往R达不到255. C#中默认抗锯齿,给人看起来柔和:但是我们现实中往往用到锯齿. ...

  3. mongodb查询之模糊查询

    mongodb的模糊查询是用正则表达式来实现的.例子如下: db.COMMODITY_COMMODITY_SHOP.find({name:{$regex :/南京/i}})

  4. linux的colrm命令

    http://book.51cto.com/art/201107/277853.htm http://book.51cto.com/art/201107/277854.htm

  5. adb服务启动失败处理命令

    执行以下命令: D:\android-sdks\platform-tools>adb kill-server --停止adb服务 D:\android-sdks\platform-tools&g ...

  6. 华为S5300交换机配置基于VLAN的本地端口镜像

    配置思路 1.  将Ethernet0/0/20接口配置为观察端口(监控端口) 2.  将VLAN 1.11.12.13.14配置为镜像VLAN 配置步骤 1.  配置观察端口 <Switch& ...

  7. HashMap的扩容机制, ConcurrentHashMap和Hashtable主要区别

    源代码查看,有三个常量, static final int DEFAULT_INITIAL_CAPACITY = 16; static final int MAXIMUM_CAPACITY = 1 & ...

  8. Something About Variable

    CONTENT(目录)    前言      Variable declearation:three rules you can break          1.Don't set var stat ...

  9. Linux "top" 命令解析

    TOP命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况.   TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户 ...

  10. JS实现定时器(类似工行网银支付限时操作)

      js脚本内容: //5秒倒计时 var num = 0 ; var max = 5 ; var id = null ; id = setInterval(box , 1000) ; //1秒钟调用 ...