繁体   English   中英

在 Android Studio 中单击按钮时呈现新视图

[英]Render a new view when a button is clicked in Android Studio

我为我的应用程序创建了一个菜单页面,其中有 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。 任何建议将不胜感激。

GameSurface对象不在活动的布局层次结构中,因此可以通过以下两种方式实现:

  1. activity_main.xml添加您的表面视图

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

然后使用

GameSurface gameView = findViewById(R.id.game_surface_view);
  1. 建议您使用addView方法(不同视图组的布局参数可能不同)在运行时通过先前的方法添加它以提高性能。

为了解决这个问题,我采取了以下步骤。

在我的 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 的类,并且是包含游戏逻辑的地方。 应该注意的是,为了做到这一点,我必须创建一个 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" />

我花了一整天的时间来解决这个问题,所以我希望它可以帮助其他人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM