Android GLSurfaceView в XML-макете

Я пытаюсь поместить GLSurfaceView и кнопку в один и тот же макет xml. Но мое приложение автоматически закрывается, когда я запускаю его на своем устройстве. Может кто-нибудь, пожалуйста, помогите мне и скажите, что мне не хватает или что не так с моим кодом?

Вот мой код

===================

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:id= "@+id/linearlayout1" > <Button android:id="@+id/buttonID" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:text="A Button" /> <com.example.test2.MyGLSurfaceView android:id="@+id/glSurfaceViewID" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.23" /> </LinearLayout> 

================

 package com.example.test2; import android.opengl.GLSurfaceView; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.Menu; import android.view.MotionEvent; public class MainActivity extends Activity { private GLSurfaceView mGLView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create a GLSurfaceView instance and set it // as the ContentView for this Activity mGLView = new MyGLSurfaceView(this); //setContentView(mGLView); setContentView(R.layout.activity_main); } // @Override protected void onPause() { super.onPause(); mGLView = (MyGLSurfaceView)findViewById(R.id.glSurfaceViewID); mGLView.onPause(); } // @Override protected void onResume() { super.onResume(); mGLView = (MyGLSurfaceView)findViewById(R.id.glSurfaceViewID); mGLView.onResume(); } } class MyGLSurfaceView extends GLSurfaceView { private final MyGLRenderer mRenderer; public MyGLSurfaceView(Context context) { super(context); // Create an OpenGL ES 2.0 context. setEGLContextClientVersion(2); // Set the Renderer for drawing on the GLSurfaceView mRenderer = new MyGLRenderer(); setRenderer(mRenderer); // Render the view only when there is a change in the drawing data setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); } private final float TOUCH_SCALE_FACTOR = 180.0f / 320; private float mPreviousX; private float mPreviousY; @Override public boolean onTouchEvent(MotionEvent e) { // MotionEvent reports input details from the touch screen // and other input controls. In this case, you are only // interested in events where the touch position changed. float x = e.getX(); float y = e.getY(); switch (e.getAction()) { case MotionEvent.ACTION_MOVE: float dx = x - mPreviousX; float dy = y - mPreviousY; // reverse direction of rotation above the mid-line if (y > getHeight() / 2) { dx = dx * -1 ; } // reverse direction of rotation to left of the mid-line if (x < getWidth() / 2) { dy = dy * -1 ; } mRenderer.mAngle += (dx + dy) * TOUCH_SCALE_FACTOR; // = 180.0f / 320 requestRender(); } mPreviousX = x; mPreviousY = y; return true; } } 

===========================

Спасибо.

В MainActivity.onCreate () используйте findViewById вместо создания нового представления (например, u в onPause, onResume) и назначайте переменную только один раз.

 setContentView(R.layout.activity_main); mGLView = (MyGLSurfaceView) findViewById(R.id.glSurfaceViewID); 

Убедитесь, что MyGLSurfaceView имеет конструкторы с AttributeSet, чтобы его можно было раздуть из XML. Ознакомьтесь с этим атрибутом stackoverflow atricle для конструкторов.

А также измените порядок Button и MyGLSurfaceView в XML, потому что теперь Button будет ниже MyGLSurfaceView в вашем макете, чтобы вы не смогли его увидеть.

Intereting Posts