在android GameActivity中使用setContentView(layout)后如何切换回“原生C++ UI”

问题描述 投票:0回答:1

我是 Android GameActivity (Java + C++) 的新手。我正在尝试在 Android studio 中使用 GameActivity 模板创建一个应用程序。当我运行该应用程序时,窗口会自动显示来自本机 C++ (NDK) 的 UI。我想使用 Views(Java) 中的 UI(一个 xml 布局而不是 C++)来创建一些按钮。当用户单击按钮时,切换回本机 C++ UI(不是布局)

这是我设置内容视图的方法:

//Template generated "MainActivity" class extended from "GameActivity" class
static {
    System.loadLibrary("Native");
}

@Override
public void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.layout); //I added this line, set the window to xml layout
}

但是现在我找不到将窗口内容设置回 Native C++ UI 的方法。

我尝试使用

setVisibility()
View.GONE
,正如这个官方文档所说的那样。

//inside OnCreated() method
setContentView(R.layout.layout);
//I didn't wait for button clicked event because this is just testing
View contentView = findViewById(R.id.mainview);//Top level Layout in xml
contentView.setVisibility(View.GONE);

整个窗户都变黑了。所以看起来

R.layout.layout
仍然在那里,但什么也看不见。 如何将窗口切换回由模板自动生成的 Native C++?

java android c++ android-ndk android-gameactivity
1个回答
0
投票

我假设您使用从模板生成的默认代码。该模板使用

GameActivity
类。当您使用此模板创建项目时,您的主要活动将从
GameActivity
类扩展。使用 Android Studio,您可以导航到它并查看它的功能。除此之外,您将看到它使用以下代码创建自己的布局:

this.mSurfaceView = new InputEnabledSurfaceView(this);
    FrameLayout frameLayout = new FrameLayout(this);
    this.contentViewId = ViewCompat.generateViewId();
    frameLayout.setId(this.contentViewId);
    frameLayout.addView(this.mSurfaceView);
    this.setContentView(frameLayout);
    frameLayout.requestFocus();
    this.mSurfaceView.getHolder().addCallback(this);
    ViewCompat.setOnApplyWindowInsetsListener(this.mSurfaceView, this);

因此,如果您在代码中调用

setContentView
,您将从 GameActivity 中删除上述所有工作 - 这样就删除了渲染游戏的 SurfaceView。

要添加您自己的布局,您需要将其从基类添加到 FrameLayout 中。您可以使用以下代码:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // contentViewId is defined in GameActivity
    val rootView = findViewById<View>(contentViewId);

    // my_layout.xml is you custom layout file
    val myLayout = layoutInflater.inflate(R.layout.my_layout, rootView as ViewGroup, false)
    rootView.addView(myLayout)
    myLayout.visibility = View.VISIBLE // or View.GONE to hide it
}
© www.soinside.com 2019 - 2024. All rights reserved.