findViewById макета ограничений возвращает null

#java #android

#java #Android

Вопрос:

У меня проблема с findViewById с использованием Java в Android Studio. Я пытаюсь получить макет ограничения для использования .addview в нем, но он возвращает null.

Это макет:

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@ id/gameLayout"
    tools:context=".GameActivity">
 

Это строка с проблемами:

 ConstraintLayout mainLayout = (ConstraintLayout) findViewById(R.id.gameLayout);
 

И он возвращает null, что я делаю плохо?

Спасибо

Редактировать: теперь я застрял после этого цикла, что может быть?

 protected void generateGameZone(int m, int n){
        LinearLayout[] main_layouts = new LinearLayout[m];
        for(int i=0;i<main_layouts.length;i  ){
            main_layouts[i] = new LinearLayout(this);
            main_layouts[i].setOrientation(LinearLayout.HORIZONTAL);
            main_layouts[i].setLayoutParams(new LinearLayout.LayoutParams(30,30));
            mainLayout.addView(main_layouts[i]);
        }
        LinearLayout[][] secondary_layouts = new LinearLayout[m][n];
        for(int i=0;i<secondary_layouts.length;i  ){
            for(int j=0;j<secondary_layouts[i].length;j  ){
                secondary_layouts[i][j] = new LinearLayout(this);
                secondary_layouts[i][j].setOrientation(LinearLayout.HORIZONTAL);
                secondary_layouts[i][j].setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
                TextView txtBox = new TextView(this);
                txtBox.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
                txtBox.setId(i*10   j);
                secondary_layouts[i][j].addView(txtBox);
                main_layouts[i].addView(secondary_layouts[i][j]);
            }
        }
    }
 

Я получаю черный экран

Edit2: черный экран решен, теперь макет, который я создаю с циклами, не отображается

Комментарии:

1. Вы уже звонили setContentView() ? Вы уверены, что это представление присутствует в переданном XML-файле setContentView() ?

Ответ №1:

Из вашего вопроса кажется, что вы пытаетесь ConstraintLayout программно добавить к своей деятельности. Однако findViewById(int) вызываемый из an Activity пытается найти уже существующее представление в иерархии и возвращает null , если оно не найдено.

Я думаю, что то, что вы ищете, это либо раздуть макет с помощью a LayoutInflater , а затем добавить его, используя addView , как вы предложили, или, если этот макет представляет корень вашей активности, используйте setContentView(int) , чтобы позволить activity обрабатывать инфляцию.

Комментарии:

1. seems like you are trying to add the ConstraintLayout programmatically что заставляет вас так говорить?

2. Извините, я только что перечитал ваш вопрос, и я думаю, что я неправильно понял. Можете ли вы предоставить код для onCreate вашей деятельности, где, я полагаю, вы используете findViewById(int) ?

3. Вы хорошо понимаете мой вопрос, я думаю, что это решение, потому что я выполняю findViewById перед setContentView, позвольте мне попробовать это. Спасибо!

4. На этом все, оно будет работать только после setContentView(int)

5. Да, это было спасибо! Я отредактировал главный вопрос, пожалуйста, если вы его видите! Спасибо