View.setEnabled(false)在android中不能正常工作

Mic*_* SM 6 android view android-ui

我刚刚发现View.setEnabled(false)在android中运行不正常,方法如下:

  1. 禁用父视图不会自动禁用子视图.这很不方便.
  2. 虽然颜色为灰色,但禁用的视图仍然可以获得焦点并获得键盘输入,做出选择等.这是不对的.
  3. 获取键盘输入时,无论输入多少,DEL/BACK都只能向后移除一个键.此行为仅在禁用的EditText中显示.
  4. 无线电标签显示为灰色,但单选按钮图像不显示灰色.

这似乎是个bug.但是如何获得真正的DISABLE功能呢?

编辑:忘记提及第一个.

Mic*_* SM 5

需要递归地设置所有后代,否则布局中的RadioButtons将不会被setEnabled,因为RadioButtons是孙子而不是直接子代,中间有RadioGroup。我根据其他人的回答在这里记录了迄今为止我最好的解决方案。

public static void setEnabledAll(View v, boolean enabled) {
    v.setEnabled(enabled);
    v.setFocusable(enabled);

    if(v instanceof ViewGroup) {
        ViewGroup vg = (ViewGroup) v;
        for (int i = 0; i < vg.getChildCount(); i++)
            setEnabledAll(vg.getChildAt(i), enabled);
    }
}
Run Code Online (Sandbox Code Playgroud)

子类此时不起作用。如果我有:

public MyView class View {
    protected void setEnabled(boolean enabled, boolean setChildren){
        setEnabled(enabled);
        setFocusable(enabled);
        if(setChildren && this isinstanceof ViewGroup){
              for ( int i = 0 ; i < this.getChildCount() ; i++ )
                  //this line will have issue if it is not MyView                      
                  this.getChildAt(i).setEnabled(enabled, true); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

除非 View 本身有这样的重载 setEnabled:

public class View {
    protected void setEnabled(boolean enabled, boolean setChildren){
        setEnabled(enabled);
        setFocusable(enabled);
        if(setChildren && this isinstanceof ViewGroup){
              for ( int i = 0 ; i < this.getChildCount() ; i++ )         
                  this.getChildAt(i).setEnabled(enabled, true); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个解决方案将消除问题1、2、3。问题4可以通过为RadioGroup设置禁用样式选择器来解决 - 我不确定为什么android没有默认的RadioGroup禁用样式选择器。也许是 Android 增强的另一个点。Android 在 SDK 设计方面非常灵活,但这也意味着有时需要额外的工作。