Android/Java-结合自定义SurfaceView和XML布局?

Android/Java-结合自定义SurfaceView和XML布局?,java,android,xml,layout,surfaceview,Java,Android,Xml,Layout,Surfaceview,我正在做一个简单的游戏作为一个项目,基本上是一个简单版本的加拉加与一些修改。我对Android和java非常陌生(主要是C++人),所以我刚开始让船自动向右移动,然后在屏幕上按住,使船向左移动。我这样做是为了保持它的简单性(因为在我的GameView中为这个任务实现一个触控式侦听器是很容易的),这样我就可以在返回并改进特定比特的功能之前完成应用程序基本框架的其余部分 现在,我的GameView是在GameActivity中以编程方式创建的,然后使用“setContentView()”将活动的视图

我正在做一个简单的游戏作为一个项目,基本上是一个简单版本的加拉加与一些修改。我对Android和java非常陌生(主要是C++人),所以我刚开始让船自动向右移动,然后在屏幕上按住,使船向左移动。我这样做是为了保持它的简单性(因为在我的GameView中为这个任务实现一个触控式侦听器是很容易的),这样我就可以在返回并改进特定比特的功能之前完成应用程序基本框架的其余部分

现在,我的GameView是在GameActivity中以编程方式创建的,然后使用“setContentView()”将活动的视图设置为新的GameView:

public class GameActivity extends AppCompatActivity {

private GameView gameView;

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

    ...

    gameView = new GameView(this, size.x, size.y);
    setContentView(gameView);
}
现在我想要的是屏幕角落里的两个小按钮,它们可以左右移动飞船,但我一直在思考如何轻松地做到这一点,因为我一直在思考的每一种方式都变得非常复杂(主要是因为我是一个安卓新手)

我能想到的两个最好的方法如下:

1) 使用Android Studio XML设计工具将按钮和我的自定义SurfaceView(GameView)放置到适当的位置,然后在我的GameActivity中使用“setContentView(R.layout.activity_game)”

这将是伟大的;然而,有两个问题我无法解决。首先,当我将“视图”拖动到GameActivity的布局中,并在弹出窗口中选择我的自定义SurfaceView“GameView”时,我得到一个错误:

此外,正如您在我发布的代码中所看到的,无论何时创建一个GameView,都需要传递两个整数,如果我只是在设计器的XML布局中放置一个GameView,我不知道如何实现这一点

2) 继续像我一样以编程方式创建GameView,使用设计器设置GameActivity布局以包含我需要的所有按钮,然后以编程方式将GameView(自定义SurfaceView)添加到GameActivity布局,最后使用“setContentView(R.layout.activity_game)”。这对我来说似乎是最简单的,但我不知道如何获取对默认情况下使用活动(activity_game.XML)创建的整个XML布局的引用,然后将创建的GameView添加到其中。我只能找到使用“findviewbyd()”引用XML生成的布局(如按钮或XML生成的布局中的线性布局)的代码示例。我想我可能能够在XML设计器中创建一个框架布局或类似的东西,然后将所有内容附加到该框架上,并使用“findviewbyd()”将我的GameView附加到框架上,但我不知道这是否可行。最后,我有一种感觉,因为XML布局上的按钮首先会存在,以编程方式添加GameView意味着按钮会被掩盖,我不知道如何避免这种情况

很抱歉,我的问题冗长,但我找不到任何示例代码或之前的问题/答案专门针对这一点,我只能找到一些我不确定如何组合起来的零碎部分

关于在“activity_game.xml”中创建按钮的最简单方法的任何帮助都会显示在我以编程方式创建的GameView的顶部,以便我可以轻松地定位按钮,并通过ID轻松地抓取按钮以供单击侦听器使用

编辑:

根据要求,这是activity_game.xml的当前设置,框架布局只是作为我实验的一部分,但现在没有实际使用,因为活动的内容视图设置为GameView。我有一个浮动的按钮,因为现在我只是想让它显示出来,一旦我达到那个点,我会担心正确的实现:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_game"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.chrisheimlich.galaticrenegade.GameActivity">

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/testFrame"
    android:layout_alignParentStart="true">

    <Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_marginStart="113dp"
        android:layout_marginTop="14dp"
        android:id="@+id/button2" />
</FrameLayout>


有趣的东西,如果你想创建一个可以在Android Studio布局编辑器中显示的视图,你需要确保该视图覆盖了构造函数。看过方法2后,可以获得对根视图组的引用,并以编程方式添加自定义视图。您能为
活动\u游戏
布局发布xml吗?@abest感谢您的链接和解释,这解释了错误。我觉得我更愿意避免这种情况,而更多地考虑我的第二个想法,但如果我不能弄清楚,我会尝试根据您链接的文档修改视图,使其正确显示。当然,我会在一秒钟内发布。我也有同样的问题,我无法找到解决办法,即使我花了最后一天的时间在互联网上搜索。你能告诉我你是如何修复它的吗?有趣的是,如果你想创建一个可以在Android Studio布局编辑器中显示的视图,你需要确保视图覆盖构造函数。看过方法2后,可以获得对根视图组的引用,并以编程方式添加自定义视图。您能为
活动\u游戏
布局发布xml吗?@abest感谢您的链接和解释,这解释了错误。我觉得我更愿意避免这种情况,而更多地考虑我的第二个想法,但如果我不能弄清楚,我会尝试根据您链接的文档修改视图,使其正确显示。当然,我会在一秒钟内发布。我也有同样的问题,我无法找到解决办法,即使我花了最后一天的时间在互联网上搜索。你能告诉我你是怎么修好的吗?