9

I just found out View.setEnabled(false) does not work quite right in android, in the following ways:

  1. Disable parent view does not automatically disable child views. This is inconvenient.
  2. Though grayed in color, disabled views can still get focus and get keyboard input, make choice, etc. This is not right.
  3. When getting keyboard input, DEL/BACK can only remove one key backward no matter how many you input. This behavior only shows in disabled EditText.
  4. Radio label is grayed but radio button image is not grayed.

It seems like a bug. But how do I get a real DISABLE feature?

EDIT: forget to mention the first.

4

4 に答える 4

5

すべての子孫を再帰的に設定する必要があります。そうしないと、レイアウト内の RadioButton が setEnabled になりません。RadioButton は直接の子ではなく孫であり、間に 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);
    }
}

現在、サブクラスは機能していません。私が持っている場合:

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); 
        }
    }
}

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); 
        }
    }
}

この解決策により、問題 1、2、3 が解消されます。問題 4 は、RadioGroup の無効なスタイル セレクターを設定することで解決できます。Android に RadioGroup のデフォルトの無効なスタイル セレクターがない理由がわかりません。たぶん、Android 拡張のもう 1 つのポイントです。Android の SDK 設計は非常に柔軟であり、追加の作業が必要になる場合もあります。

于 2013-10-07T21:23:00.233 に答える
2

記憶から、タイプミスを許してください:

class ExtendedLinearLayout extends LinearLayout{

    protected void setEnabled(boolean enabled, boolean setChildren){

        super.setEnabled(enabled);

        if(setChildren){
              for ( int idx = 0 ; idx < this.getChildCount() ; idx++ ) {
                  (View)(this.getChildAt(idx)).setEnabled(enabled);
              }
        }
    }
}
于 2013-10-07T13:39:03.733 に答える