Как я могу использовать GLSurfaceView в LinearLayout вместе с другими представлениями, такими как TextView или Button?

Я делаю небольшую игру на Android 2.3.3 и хочу использовать openGLES. Мой вопрос заключается в том, могу ли я использовать GLSurfaceView и TextView, Button в одном и том же макете. Мой XML-файл макета выглядит следующим образом

  <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" 
android:gravity="center_horizontal" >

<com.ecnu.sei.manuzhang.nim.GameView
    android:id="@+id/game_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="20dip"
    android:layout_weight="1"
 />

<TextView
    android:id="@+id/info_turn"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:layout_marginBottom="10dip"
 />

<Button
    android:id="@+id/next_turn"
    android:text="@string/button_text"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dip"
    android:layout_marginRight="20dip"
/>

Когда GameView extends GLSurfaceView будут ошибки java.lang.NoSuchMethodException: GameView(Context,AttributeSet), но GameView extends GLSurfaceView подойдет.
Если нет, есть ли способ собрать эти виджеты вместе?
Заранее спасибо


person manuzhang    schedule 23.11.2011    source источник


Ответы (1)


При расширении View или, в данном случае, GLSurfaceView вам может понадобиться разместить правильный конструктор.

В вашем случае вам не хватает этого:

public GameView(Context context, AttributeSet attrs)

Вы можете проверить, как это делается внутри cocos2d-x с помощью Cocos2dxGLSurfaceView.

person Macarse    schedule 23.11.2011
comment
это означает, что я должен позвонить super(context, attrs) ? - person manuzhang; 23.11.2011
comment
Неа. Когда вы помещаете пользовательское представление в свой xml, ОС будет использовать конструктор, о котором я упоминал, для создания объекта. Вам нужно будет иметь этот конструктор в вашем классе. - person Macarse; 23.11.2011
comment
Да, теперь это работает! Большое спасибо! Я просто копирую коды из официального руководства разработчика, но мне любопытно, как вы вообще это понимаете. - person manuzhang; 23.11.2011
comment
@manuzhang: Это распространенная ошибка, и я забываю об этом каждый раз, когда расширяю View. - person Macarse; 23.11.2011