我是 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++?
我假设您使用从模板生成的默认代码。该模板使用
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
}