すべての子孫を再帰的に設定する必要があります。そうしないと、レイアウト内の 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 設計は非常に柔軟であり、追加の作業が必要になる場合もあります。