Как получить доступ к завышенным представлениям в линейном макете

Я использую компоновщик, чтобы раздуть линейный макет с некоторыми кнопками и некоторыми текстовыми представлениями. Как я могу получить доступ к виджетам в надутом макете?

Например: у меня есть кнопка, и я хочу установить для нее прослушиватель onclick. Обычно вы объявляете кнопку с помощью «findViewById», а затем устанавливаете прослушиватель. Но надутые кнопки отсутствуют в XML-файле активности (линейный макет находится в другом XML-файле, а не в XML-файле активности), чтобы найти их представление с помощью «findViewById».

Мой код инфлятора:

 LinearLayout item = (LinearLayout )findViewById(R.id.linear_layout_duel_basic_easy);
            View child_1 = getLayoutInflater().inflate(R.layout.linear_layout_duel_1, null);
            item.addView(child_1);

Макет, который я хочу раздуть:

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:orientation="horizontal"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Button" />
</LinearLayout>

Спасибо за любую помощь.


person Manos Rasidakis    schedule 30.04.2018    source источник
comment
Попробуйте child_1.findViewById(R.id.btn_id)   -  person Deˣ    schedule 30.04.2018


Ответы (3)


Он должен работать. Здесь нет ничего особенного.

   LinearLayout item = findViewById(R.id.linear_layout_duel_basic_easy);
    for (int i = 0 ; i < 10; i++) {
        View child = getLayoutInflater().inflate(R.layout.linear_layout_duel_1, null);
        item.addView(child);
        final int finalI = i;
        child.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "clicked = " + finalI, Toast.LENGTH_LONG).show();
            }
        });
    }
person Deˣ    schedule 30.04.2018
comment
Если я надую его во второй раз, он выдаст ошибку: у указанного дочернего элемента уже есть родитель. - person Manos Rasidakis; 30.04.2018
comment
@ManosRasidakis Отредактировал ответ. Проверять. Примите ответ, если работает. - person Deˣ; 30.04.2018
comment
Если я хочу раздуть макет в 10 раз, мне нужно сделать child_1,child_2,...child_10? - person Manos Rasidakis; 30.04.2018
comment
@ManosRasidakis несколько раз обновлялся. finalI — ссылка на позицию. какая последовательность кнопок нажата. - person Deˣ; 30.04.2018

Согласно комментарию:

В действии xml у меня есть вертикальный линейный макет (созданный для просмотра прокрутки), а в xml, который я использую для раздувания, есть горизонтальный линейный макет, где кнопка и текстовое представление

Вот как вы можете этого добиться.

LinearLayout item = (LinearLayout)findViewById(R.id.linear_layout_duel_basic_easy); // Your vertical linearLayout
View child_1 = getLayoutInflater().inflate(R.layout.linear_layout_duel_1, null);// Your Horizontal LinearLayout
item.addView(child_1);

Чтобы получить доступ к представлению внутри горизонтального LinearLayout: -

TextView tv = child_1.findViewById(R.id.textView);
Button btn = child_1.findViewById(R.id.button);
person Paresh P.    schedule 30.04.2018
comment
Я думаю, что если я сделаю это, я дам идентификатор linear_layout вместо кнопки внутри него. - person Manos Rasidakis; 30.04.2018
comment
Является ли child_1 кнопкой? - person Paresh P.; 30.04.2018
comment
Нет. это линейный макет, который содержит кнопку - person Manos Rasidakis; 30.04.2018
comment
Хорошо, тогда где кнопка? В вашем фрагменте item это LinearLayout, и вы добавляете представление child_1 в LinearLayout. - person Paresh P.; 30.04.2018
comment
В XML-файле активности у меня есть вертикальный линейный макет (созданный для просмотра прокрутки), а в XML-файле, который я использую для раздувания, есть горизонтальный линейный макет, где есть кнопка и текстовое представление. Я хочу раздуть горизонталь внутри вертикали и получить доступ к новым кнопкам. - person Manos Rasidakis; 30.04.2018
comment
Если я надую его во второй раз, он выдаст ошибку: указанный ребенок уже имеет родителя - person Manos Rasidakis; 30.04.2018
comment
Потому что вы не можете дважды добавить одно и то же представление в родительский объект. Чтобы добавить его снова, вам нужно создать новый вид (надуть child_2, а затем добавить его). - person Paresh P.; 30.04.2018
comment
Если я хочу раздуть макет в 10 раз, мне нужно сделать child_1,child_2,...child_10? - person Manos Rasidakis; 30.04.2018
comment
Используйте цикл for для увеличения представлений. Это основы. - person Paresh P.; 30.04.2018

Вы пытались переопределить onFinishInflate()?

Внутри вы можете найти надутую кнопку, вы можете просто перебрать все свои дочерние элементы, чтобы найти нужное вам представление.

//iterate children
for (int index = 0; index < getChildCount(); index+=1){
            getChildAt(index);
//check if that view is what you need
        }
person Maksym V.    schedule 30.04.2018
comment
Как мне повторить? - person Manos Rasidakis; 30.04.2018