如何使一组视图可编辑

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

onViewCreatedonCreate

中初始化
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.