Как сделать группу просмотров редактируемой - PullRequest
1 голос
/ 04 июля 2019

У меня есть макет, в котором есть счетчики, editText и флажки.Есть два режима:

1 - редактировать все виды (режим редактирования)

2 - просматривать (не режим редактирования)

Но я не хочу делать это для каждогоПосмотреть .Есть ли способ установить editable true или false?

Ответы [ 3 ]

0 голосов
/ 04 июля 2019

Простой способ - создать набор таких видов вручную:

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

Он собирает все необходимые представления, поэтому вы можете сделать их включенными или отключенными.Но вы должны отметить, что этот вариант не так гибок, и вы должны предпочесть только первый.(В случае каких-либо исключений вы должны исключить некоторые)

0 голосов
/ 04 июля 2019

Этот метод включит / отключит все виджеты вашего родительского макета.

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.
0 голосов
/ 04 июля 2019

в режиме редактирования используйте это при каждом просмотре

yourView.setEnabled(true);

в режиме чтения используйте это

yourView.setEnabled(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...