Моя настройка выглядит следующим образом: у TabHost есть два дочерних действия, каждое с одним GLSurfaceView в качестве содержимого. Две Activity, конечно же, пересылают свои события onPause() и onResume() в свои GLSurfaceViews.
Первое действие работает, как и ожидалось, однако переключение на другую вкладку не имеет визуального эффекта. LogCat показывает, что и onSurfaceCreated(), и onSurfaceChanged(), и onSurfaceDraw() вызываются, как и ожидалось, в обоих экземплярах GLSurfaceView.
«Исправление» состоит в том, чтобы установить видимость каждого GLSurfaceView с помощью setVisibility(View.INVISIBLE/VISIBLE) в onPause() и onResume() соответственно. Это приводит к отображению правильных представлений, но имеет обратную сторону, вызывая эффект мерцания при смене вкладки. Это особенно очевидно, когда GLSurfaceView делает больше работы.
По сути, как мне избежать необходимости устанавливать ВИДИМОСТЬ GLSurfaceViews?
Вкладка Активность:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainactivity);
TabHost tabHost = getTabHost();
TabHost.TabSpec spec;
Intent intent;
// First Vortex view
intent = new Intent().setClass(this, VortexActivity.class);
spec = tabHost.newTabSpec("A")
.setIndicator("A")
.setContent(intent);
tabHost.addTab(spec);
// Second Vortex view
intent = new Intent().setClass(this, VortexActivity.class);
spec = tabHost.newTabSpec("B")
.setIndicator("B")
.setContent(intent);
tabHost.addTab(spec);
}
Деятельность ребенка:
public class VortexActivity extends Activity {
private GLSurfaceView view;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = new GLSurfaceView(this);
view.setRenderer(new VortexRenderer());
setContentView(view);
}
@Override
public void onResume() {
super.onResume();
view.onResume();
//view.setVisibility(View.VISIBLE);
}
@Override
public void onPause() {
super.onPause();
view.onPause();
//view.setVisibility(View.INVISIBLE);
}
}
Рендерер:
public class VortexRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 glArgument, EGLConfig config) {
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
}
public void onDrawFrame(GL10 gl) {
long ms = System.currentTimeMillis() % 2000;
if(ms > 1000)
ms = 1000 - (ms - 1000);
float intensity = ms / 500.0f;
gl.glClearColor(intensity, intensity, intensity, 1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
}
}
Макет:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="0dp" >
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="0dp" />
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:padding="0dp" />
</LinearLayout>