Opengl es 2.0 нулевой указатель из findViewById

#android #opengl-es #opengl-es-2.0

#Android #opengl-es #opengl-es-2.0

Вопрос:

Я пытаюсь настроить приложение с использованием OpenGL ES 2.0, используя следующий учебник: http://androidblog.reindustries.com/a-real-open-gl-es-2-0-2d-tutorial-part-1 /

Итак, я смог успешно скомпилировать приложение и запустить его в эмуляторе, но как только оно запускается, приложение вылетает… У меня есть только 2 файла макета: activity_main.xml:

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.openglproject1.MainActivity"
    tools:ignore="MergeRootFrame" />
 

и fragment_main.xml:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@ id/gamelayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
</RelativeLayout>
 

Из моего расследования выяснилось, что:

 RelativeLayout layout = (RelativeLayout) findViewById(R.id.gamelayout);
 

в методе onCreate MainActivity:

 protected void onCreate(Bundle savedInstanceState) {

        // Turn off the window's title bar
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        // Super
        super.onCreate(savedInstanceState);

        // Fullscreen mode
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // We create our Surfaceview for our OpenGL here.
        glSurfaceView = new GLSurf(this);

        // Set our view.
        setContentView(R.layout.activity_main);

        // Retrieve our Relative layout from our main layout we just set to our view.
        RelativeLayout layout = (RelativeLayout) findViewById(R.id.gamelayout);

        // Attach our surfaceview to our relative layout from our main layout.
        RelativeLayout.LayoutParams glParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
        layout.addView(glSurfaceView, glParams);
    }
 

возвращает нулевой указатель… Весь код, который я использовал, представлен по ссылке выше, но если вы хотите, я также могу вставить его сюда, хотя он немного большой. Мне просто интересно, нужен ли мне какой-либо дополнительный файл для игрового процесса или что-нибудь еще ?… Это все очень запутанно для меня, поэтому, пожалуйста, не стесняйтесь предлагать какие-либо советы! Я был бы очень благодарен за помощь!

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

1. В вашем activity_main нет ничего, что ссылается на R.id.gamelayout. Указанный макет находится внутри вашего fragment_main.xml

Ответ №1:

Вы устанавливаете свой макет активности на

 setContentView(R.layout.activity_main);
 

Источником для которого является:

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.openglproject1.MainActivity"
    tools:ignore="MergeRootFrame" />
 

Однако вы пытаетесь получить доступ R.id.gamelayout к действию, однако указанный макет указан в вашем fragment_main.xml:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@ id/gamelayout"             //OVER HERE
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
</RelativeLayout>
 

Итак, очевидно, что ошибка заключается здесь.

Измените эту строку setContentView(R.layout.activity_main); на setContentView(R.layout.fragment_main); и дайте мне знать, работает ли она?

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

1. Я уже пытался заменить содержимое activity_main на fragment_main или добавить код из fragment_main в activity_main и т.д… но все напрасно. На самом деле я не понимаю, почему я получаю 2 макета, создавая действие, когда в учебниках я всегда использовал только fragment_main.xml чтобы добавить некоторые виды, такие как кнопки и т.д… Я все еще не совсем уверен, как это решить :/

2. Вам не нужно заменять / удалять.. просто ссылайтесь на то, что вы указываете в макете, привязанном к вашей активности. Если это представление находится в вашем макете хорошо и хорошо, если нет, вы получите NPE.

3. Если я изменю только эту одну строку, проблема не исчезнет. Но если я изменю содержимое на fragment_main перед findViewById и верну ему значение activity_main после него, тогда приложение в конечном итоге не завершится сбоем. Но правильный ли это подход?

4. На самом деле приложение не рисует треугольник, как предполагалось, поэтому я думаю, что все еще что-то не так