Как я могу отключить все виды внутри макета? - PullRequest
63 голосов
/ 15 августа 2011

Например, у меня есть:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
        android:layout_height="fill_parent">
     <Button 
        android:id="@+id/backbutton"
        android:text="Back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <LinearLayout
        android:id="@+id/my_layout"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/my_text_view"
            android:text="First Name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <EditText
            android:id="@+id/my_edit_view"
            android:width="100px"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" /> 
        <View .../>
        <View .../>
        ...
        <View .../>
    </LinearLayout>

</LinearLayout>

Есть ли способ отключить (setEnable (false)) все элементы внутри LinearLayout my_layout?

Ответы [ 18 ]

1 голос
/ 11 октября 2016

Используйте нижеприведенную рекурсивную функцию, чтобы сделать ваши дочерние представления видимыми или ушли .Первый аргумент - это ваше родительское представление, а второй аргумент решает, хотите ли вы, чтобы дочерние элементы родительского представления были видимыми или исчезли. true = видимый false = пропал

private void layoutElemanlarininGorunumunuDegistir(View view, boolean gorunur_mu_olsun) {
    ViewGroup view_group;
    try {
        view_group = (ViewGroup) view;
        Sabitler.konsolaYazdir(TAG, "View ViewGroup imiş!" + view.getId());
    } catch (ClassCastException e) {
        Sabitler.konsolaYazdir(TAG, "View ViewGroup değilmiş!" + view.getId());
        return;
    }

    int view_eleman_sayisi = view_group.getChildCount();
    for (int i = 0; i < view_eleman_sayisi; i++) {
        View view_group_eleman = view_group.getChildAt(i);
        if (gorunur_mu_olsun) {
            view_group_eleman.setVisibility(View.VISIBLE);
        } else {
            view_group_eleman.setVisibility(View.GONE);
        }
        layoutElemanlarininGorunumunuDegistir(view_group_eleman, gorunur_mu_olsun);
    }
}
0 голосов
/ 17 июня 2019

Я лично использую что-то вроде этого (вертикальный обход дерева с помощью рекурсии)

fun ViewGroup.deepForEach(function: View.() -> Unit) {
    this.forEach { child ->
        child.function()
        if (child is ViewGroup) {
            child.deepForEach(function)
        }
    }
}

использование:

   viewGroup.deepForEach { isEnabled = false }
0 голосов
/ 11 июня 2019

В Kotlin вы можете использовать isDuplicateParentStateEnabled = true до того, как View будет добавлено к ViewGroup.

Как описано в методе setDuplicateParentStateEnabled, если дочернее представление имеет дополнительные состояния (например, состояние флажка для флажка), родительские элементы не будут затронуты.

Аналог xml: android:duplicateParentState="true".

0 голосов
/ 22 марта 2018

Это довольно запоздалый ответ. Но он может кому-то помочь. Многие из упомянутых выше ответов кажутся хорошими. Но если ваш layout.xml имеет вложенные группы просмотра. Тогда приведенные выше ответы могут не дать полного результата. Следовательно я отправил свое мнение как фрагмент. С помощью приведенного ниже кода можно отключить все представления (включая вложенные группы представлений).

ПРИМЕЧАНИЕ. Старайтесь избегать вложенных групп ViewGroup, поскольку они не рекомендуются.

 private void setEnableView(boolean b) {
    LinearLayout layout = (LinearLayout)findViewById(R.id.parent_container);
    ArrayList<ViewGroup> arrVg = new ArrayList<>();
    for (int i = 0; i < layout.getChildCount(); i++) {
        View child = layout.getChildAt(i);
        if (child instanceof ViewGroup) {
            ViewGroup vg = (ViewGroup) child;
            arrVg.add(vg);
        }
        child.setEnabled(b);
    }

    for (int j=0;j< arrVg.size();j++){
        ViewGroup vg = arrVg.get(j);
        for (int k = 0; k < vg.getChildCount(); k++) {
         vg.getChildAt(k).setEnabled(b);
        }
    }
}
0 голосов
/ 19 марта 2018

Я улучшил отклик tütü , чтобы правильно отключить компоненты EditText и RadioButton. Кроме того, я поделился способом, которым я нашел, чтобы изменить видимость представления и добавить прозрачность в отключенных представлениях.

private static void disableEnableControls(ViewGroup view, boolean enable){
    for (int i = 0; i < view.getChildCount(); i++) {
        View child = view.getChildAt(i);
        child.setEnabled(enable);
        if (child instanceof ViewGroup){
            disableEnableControls((ViewGroup)child, enable);
        }
        else if (child instanceof EditText) {
            EditText editText = (EditText) child;
            editText.setEnabled(enable);
            editText.setFocusable(enable);
            editText.setFocusableInTouchMode(enable);
        }
        else if (child instanceof RadioButton) {
            RadioButton radioButton = (RadioButton) child;
            radioButton.setEnabled(enable);
            radioButton.setFocusable(enable);
            radioButton.setFocusableInTouchMode(enable);
        }
    }
}

public static void setLayoutEnabled(ViewGroup view, boolean enable) {
    disableEnableControls(view, enable);
    view.setEnabled(enable);
    view.setAlpha(enable? 1f: 0.3f);
}

public static void setLayoutEnabled(ViewGroup view, boolean enable, boolean visibility) {
    disableEnableControls(view, enable);
    view.setEnabled(enable);
    view.setAlpha(enable? 1f: 0.3f);
    view.setVisibility(visibility? View.VISIBLE: View.GONE);
}
0 голосов
/ 22 февраля 2018

Если вы хотите отключить набор или сказать определенный вид представления. Допустим, вы хотите отключить фиксированное количество кнопок с определенным текстом или без текста, тогда вы можете использовать массив этого типа и проходитьэлементы массива при отключении кнопок с помощью свойства setEnabled (false). Вы можете сделать это при вызове функции следующим образом:

public void disable(){
        for(int i=0;i<9;i++){
                if(bt[i].getText().equals("")){//Button Text condition
                    bt[i].setEnabled(false);
            }
        }
}
0 голосов
/ 29 апреля 2015

Установить

android:descendantFocusability="blocksDescendants"

для просмотра ViewGroup.Все потомки не будут фокусироваться.

0 голосов
/ 16 марта 2015

, чтобы отключить представление, вы должны вызвать метод setEnabled со значением false для аргумента.например:

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