Android надуть ConstraintLayout вне Activity - PullRequest
2 голосов
/ 17 июня 2020

Я прочитал несколько тем о надувных устройствах вне Activity, но предложенные решения не сработали. У меня нет ошибок, ConstraintLayout просто не отображается.

Вот что я хочу что нужно сделать:

Я разрабатываю игру (ориентация экрана - «альбомная»), поэтому я создал GameView, в котором есть прогон l oop, и я делю экран на два детали на холсте (без фрагмента):

  • слева экран игры. Его размеры: height = screen_height, width = game_width

  • справа, я хочу нарисовать панель инструментов (a ConstraintLayout), содержащую некоторые вещи (стрелки направления, информацию о пользователе, ...)

Я инициализирую панель инструментов в конструкторе и рисую ее в функции рисования.

Панель инструментов XML код:

<androidx.constraintlayout.widget.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/toolbar_layout"
     android:background="@color/light_brown
     android:layout_width="match_parent"
     android:layout_height="match_parent">

     <!-- ImageViews, Buttons -->

</androidx.constraintlayout.widget.ConstraintLayout>

Код GameView:

public class GameWorldView extends SurfaceView implements Runnable {
    private ConstraintLayout toolbar = null;
    // ... and other attributes

    // constructor
    public GameWorldView(Context context, int screen_x, int screen_y) {
        //... do some stuff

        toolbar = new ConstraintLayout(context);
        toolbar.layout(0,0,width,height);
        toolbar.setBackgroundColor(Color.parseColor("#00ffff")); //cyan

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ConstraintLayout inner_toolbar = (ConstraintLayout) inflater.inflate(R.layout.toolbar_layout, toolbar,false);
        toolbar.addView(inner_toolbar);
    }

    // draw on the canvas
    private void draw(){
        if(holder.getSurface().isValid()) {
            canvas = holder.lockCanvas();

            canvas.drawColor(Color.argb(255, 255, 255, 255));
            // ... draw everything and then the toolbar

            canvas.save();
            canvas.translate(x_begin, 0);
            toolbar.draw(canvas);
            canvas.restore();

            holder.unlockCanvasAndPost(canvas);
        }
    }
}

Я вижу голубой прямоугольник в нужном месте (когда я не устанавливаю цвет фона, я вижу цвет GameView, который Я установил функцию «рисовать»), но она не показывает макет «панели инструментов», который я накачал.

Я пробовал разные вещи, которые видел в других сообщениях, например:

LayoutInflater inflater = LayoutInflater.from(context);

или попытка определить панель инструментов как LinearLayout вместо ConstraintLayout.

Я думаю, что проблема в трех строках о надувном устройстве, но я нашел их в других сообщениях, пытающихся решить проблему, похожую на мою ...

Спасибо.

...