如何使一组视图可编辑

时间:2019-07-04 09:59:14

标签: android android-layout android-view android-xml

我有一个布局,其中有微调框,editText和复选框。有两种模式:

1-编辑所有视图(编辑模式)

2视图(非编辑模式)

但是我不想为每个视图都这样做。有什么方法可以将editable设置为true或false?

3 个答案:

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

onViewCreatedonCreate中初始化它

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.