【问题标题】:Render a new view when a button is clicked in Android Studio在 Android Studio 中单击按钮时呈现新视图
【发布时间】:2020-04-02 12:12:43
【问题描述】:

我为我的应用创建了一个菜单页面,其中有 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)); 

现在我有了这个菜单页面,其中包含我在 MainActivity 类中以下列方式分配给变量的 4 个按钮(仅显示一个用于示例目的)。

    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。任何建议将不胜感激。

【问题讨论】:

    标签: java android android-studio


    【解决方案1】:

    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 的方法(布局参数对于不同的视图组可能不同)在运行时通过以前的方法添加它以提高性能。

    【讨论】:

    • 您好,感谢您的回复。我目前没有用于游戏界面的 XML 文件,并且是一个绘制带有字符的画布的类,这种方法仍然可行吗?
    • @Grilla99 解决方案和你的一样,我没有创建任何额外的活动,只是在activity_main.xml 中添加packgename.GameSurface 或你想要的任何xml 或使用addview,两者都应该工作跨度>
    【解决方案2】:

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

    在我的 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" />
    

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

    【讨论】:

    • 你可以在游戏活动中简单地做,this.setContentView(R.layout.activity_game),正如我的回答所建议的那样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 2015-05-22
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多