Визуализация нового вида при нажатии кнопки в Android Studio - PullRequest
0 голосов
/ 02 апреля 2020

Я создал страницу меню для моего приложения, в которой есть 4 кнопки с разными функциями. Перед добавлением на этой странице меню мой код выглядел следующим образом в моей Activity_main. xml

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //sets full screen
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        //set no title
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        this.setContentView(new GameSurface(this)); 

Теперь у меня есть эта страница меню с 4 кнопками, которые я назначил в классе MainActivity для переменной в следующим образом (только один показан в качестве примера).

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button newGameBtn = findViewById(R.id.new_game_btn);

Затем я создал слушателей onclick примерно так:

newGameBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

Я пробовал разные методы в этом, чтобы заставить класс GameSurface загружаться (класс, который до загрузки игры), он расширяет SurfaceView и реализует SurfaceHolder.Callback. Любые предложения будут высоко оценены.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Чтобы устранить эту проблему, я предпринял следующие шаги:

В свой MainActivity я добавил следующий код:

public class MainActivity extends AppCompatActivity {
    private Context mContext = this;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button newScreen = (Button) findViewById(R.id.new_game_btn);
        Button exit = (Button) findViewById(R.id.exit_btn);

        newScreen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, GameActivity.class);
                mContext.startActivity(intent);
            }
        });

В класс GameActivity включен мой вышеупомянутый код, который я использовал в MainActivity для запуска моего вида поверхности, показанного ниже для справки.

//Launches a surface view

public class GameActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //sets full screen
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        //set no title
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        this.setContentView(new GameSurface(this));
    }
}

А мой класс GameSurface - это тот, который расширяет SurfaceView и содержит лог c игры. Следует отметить, что для этого мне нужно было создать файл activity_game. xml и связать его с моим видом игровой поверхности следующим образом:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:background="#0099cc" tools:context=".GameActivity">
    <com.example.fxgame.GameSurface
        android:id="@+id/mainview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

Это все еще не работало после реализации этого, однако используя выходной журнал, я обнаружил, что еще не добавил действие, на которое ссылается мой MainActivity, в мой манифест android, в котором определены действия. Это было исправлено добавлением следующей строки кода в теге:

<activity android:name=".GameActivity" />

Я потратил целый день на это, так что надеюсь, что это поможет кому-то еще.

0 голосов
/ 02 апреля 2020

Объект GameSurface не находится в иерархии макета операции, поэтому этого можно достичь двумя способами:

  1. Добавить вид поверхности в activity_main.xml

    <root>
        <packgename.GameSurface
            android:id="@+id/game_surfce_view"
        .../>
    </root>
    

, затем используйте

GameSurface gameView = findViewById(R.id.game_surface_view);
Вы addView подход (параметры макета могут быть разными для разных групп представлений), чтобы добавить его во время выполнения с помощью предыдущего метода рекомендуется для производительности.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...