Макет активности не отображается во время загрузки игры (начиная с Android API 24) - PullRequest
0 голосов
/ 05 марта 2020

В игре присутствует рендеринг OpenGL (компонент app.OGlSurfaceView). Во время загрузки игры на черном экране отображается компонент textView «Загрузка ...».

GameActivity. xml:

<androidx.constraintlayout.widget.ConstraintLayout 
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".activities.GameActivity">

  <app.OGlSurfaceView
    android:id="@+id/oglView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

  <androidx.constraintlayout.widget.ConstraintLayout
    android:background="@color/black">
    <TextView
      android:id="@+id/load_level_text"
      android:text="Loading..."/>
  </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

Это хорошо работает на Android с API 14-23. Но начиная с версии API 24 (Android 7.0), сообщение о загрузке на черном экране не появляется, но продолжает отображаться раскладка MainActivity. xml (до тех пор, пока игра не загрузится). Вопрос: как сделать так, чтобы сообщение появлялось во время загрузки игры? Буду благодарен за ответы.

1 Ответ

0 голосов
/ 07 марта 2020

Найден обходной путь. Начиная с android 7.0, используйте AsyncTask в MainActivity.

MainActivity.kt:

class MainActivity: AppCompatActivity(view: View) {
    ...
    fun startGameButtonClick() { // start the game
        val layout: ConstraintLayout = findViewById(R.id.loading_layout)
        Loading(layout).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
        ...
        val intent = Intent(this, GameActivity::class.java)
        startActivity(intent)
    }
}

AsyncTask. java:

public class Loading extends AsyncTask<Void, Void, Void> {
    private WeakReference<ConstraintLayout> layout;

    public Loading(ConstraintLayout layout) {
        this.layout = new WeakReference<>(layout);
    }

    @Override
    protected void onPreExecute() {
        layout.get().setVisibility(View.VISIBLE); // show load message
    }
    ...
}
...