如何使一组视图可编辑
How to make a group of views editable
我有一个布局,其中有微调器、editText 和复选框。有两种模式:
1- 编辑所有视图(编辑模式)
2-视图(非编辑模式)
但我不想对每个视图都这样做。有什么方法可以设置 editable
是真还是假?
在编辑模式下,在每个视图中使用它
yourView.setEnabled(true);
在阅读模式下使用这个
yourView.setEnabled(false);
简单的方法是手动创建一组这样的视图:
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
它收集所有需要的视图,因此您可以启用或禁用它们。但是你应该注意,这个变体不是那么灵活,你应该只喜欢第一个。 (如果有任何例外,你必须排除一些)
此方法将 enable/disable 您父布局的所有小部件。
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.
我有一个布局,其中有微调器、editText 和复选框。有两种模式:
1- 编辑所有视图(编辑模式)
2-视图(非编辑模式)
但我不想对每个视图都这样做。有什么方法可以设置 editable
是真还是假?
在编辑模式下,在每个视图中使用它
yourView.setEnabled(true);
在阅读模式下使用这个
yourView.setEnabled(false);
简单的方法是手动创建一组这样的视图:
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
它收集所有需要的视图,因此您可以启用或禁用它们。但是你应该注意,这个变体不是那么灵活,你应该只喜欢第一个。 (如果有任何例外,你必须排除一些)
此方法将 enable/disable 您父布局的所有小部件。
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.