我有一个布局,其中有微调框,editText和复选框。有两种模式:
1-编辑所有视图(编辑模式)
2视图(非编辑模式)
但是我不想为每个视图都这样做。有什么方法可以将editable
设置为true或false?
答案 0 :(得分:0)
在编辑模式下在每个视图中使用
yourView.setEnabled(true);
在读取模式下使用此
yourView.setEnabled(false);
答案 1 :(得分:0)
简单的方法是手动创建一组此类视图:
val editableViews: Set<View> = setOf(v1, v2, v3)
并使用它:
editableViews.forEach { it.enabled = isEditMode }
如果布局复杂,则可以添加动态初始化:
private fun getAllViews(
view: View,
set: MutableSet<View>,
filter: (view: View) -> Boolean = {true}
){
val viewGroup = view as? ViewGroup
if (viewGroup != null) {
for (i: Int in 0 until viewGroup.childCount) {
val child = viewGroup.getChildAt(i)
getAllViews(child, set)
}
} else {
if (filter()) {
set.add(view)
}
}
}
在onViewCreated
或onCreate
中初始化它
val views = mutableSetOf<View>()
getAllViews(root, views) {
it is Spinner || it is EditText || it is Checkbox
}
editableViews = views
它会收集所有必需的视图,因此您可以启用或禁用它们。但是您应该注意,这种变体不是那么灵活,您应该只选择第一个。 (以防万一,您必须排除某些例外)
答案 2 :(得分:0)
此方法将启用/禁用父级布局的所有小部件。
public void enableAllView(ViewGroup rootView, boolean state) {
for (int i = 0; i < rootView.getChildCount(); i++) {
View childAt = rootView.getChildAt(i);
if (childAt instanceof ViewGroup ) {
enableAllView((ViewGroup) childAt, state);
} else {
if (childAt instanceof EditText) {
EditText child = (EditText) childAt;
child.setEnabled(state);
child.setFocusable(state);
} else if (childAt instanceof Spinner) {
Spinner child = (Spinner) childAt;
child.setEnabled(state);
child.setFocusable(state);
} else if (childAt instanceof CheckBox) {
CheckBox child = (CheckBox) childAt;
child.setEnabled(state);
child.setFocusable(state);
}
}
}
}
这样调用此方法-
enableAllView(rootView, true); // in case of edit(enable)
enableAllView(rootView, false); // in case of view(disable)
//rootView is a view in which your spinners/editText/checkbox are availabe.