#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. На самом деле приложение не рисует треугольник, как предполагалось, поэтому я думаю, что все еще что-то не так