问题是您正在尝试创建一个 Android 小部件,我怀疑您是在 Libgdx-core 实现中进行的。核心实现没有对 Android SDK 的任何引用。
那是因为继承核心项目的是Android项目。因此,核心项目不知道加载到 Android 实现的任何依赖项。
要克服这个问题,您需要在 Android 项目和核心项目之间创建一个接口。这将允许您调用 Android 项目中的方法。
该接口必须在核心项目中创建,以便两个项目都可以访问它。
例如,您在核心项目中创建 CrossPlatformInterface.java。但首先让我们创建一个回调以从 Libgdx 线程内的 Ui 线程获取反馈。 重要的是要记住 Libgdx 有一个与 Android 主线程分开的线程!!!如果您尝试从 Libgdx 线程运行 Android 小部件,应用程序将会崩溃。
让我们为 AlertDialog 进行回调。我将在这里建议一个 Abstract 类,以便能够仅覆盖您想要的方法,因为有时 Alertdialog 可以有 1,2 或 3 个按钮。
在核心项目中创建 AlertDialogCallback.java:
public abstract class AlertDialogCallback{
public abstract void positiveButtonPressed();
public void negativeButtonPressed(){}; // This will not be required
public void cancelled(){}; // This will not be required
}
在Core Project中也创建CrossPlatformInterface.java:
public interface CrossPlatformInterface{
public void showAlertDialog(AlertDialogCallback callback);
}
您注意到在 showAlertDialog 方法中,我们通过回调来获取按钮按下时的反馈!
然后您在 Android 项目中创建一个类,该类将实现 CrossPlatformInterface,如:
public ClassInsideAndroidProject implements CrossPlatFormInterface{
private AndroidLauncher mActivity; // This is the main android activity
public ClassInsideAndroidProject(AndroidLauncher mActivity){
this.mActivity = mActivity;
}
public void showAlertDialog(final AlertDialogCallback callback){
mainActivity.runOnUiThread(new Runnable(){
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
builder.setTitle("Test");
builder.setMessage("Testing");
builder.setPositiveButton("OKAY", new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
callback.positiveButtonPressed();
}
});
builder.setNegativeButton(negativeButtonString, new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
callback.negativeButtonPressed();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
});
}
}
重要提示
- CrossPlatformInterface 将在 MainActivity (AndroidLauncher) 中实例化,如下所示。
- AlertDialog 将在 android UI 线程中创建。因为我们来自 Libgdx 线程来创建 AlertDialog,所以我们需要使用 runOnUiThread 来确保在 ui 线程中创建 AlertDialog。
最后如何执行这个:
在 Android 主 Activity 中实例化 CrossPlatform 接口,并将 Activity 传递给在 MyGdxGame 中传递的 Interface 实例:
public class MainActivity extends AndroidApplication {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
cfg.useGL20 = false;
initialize(new MyGdxGame(new ClassInsideAndroidProject(this)), cfg);
}
}
最后,当 MyGDxGame 被创建时,我们得到了跨平台接口的实例,我们可以调用我们想要的任何函数到 android ui 线程。
public class MyGdxGame extends Game {
ClassInsideAndroidProject crossPlatformInterface;
public MyGdxGame(ClassInsideAndroidProject crossPlatformInterface){
this.crossPlatformInterface = crossPlatformInterface;
}
@Override
public void create() {
crossPlatformInterface.showAlertDialog(new AlertDialogCallback(){
@Override
public void positiveButtonPressed(){
//IMPORTANT TO RUN inside this method the callback from the ui thread because we want everything now to run on libgdx thread! this method ensures that.
Gdx.app.postRunnable(new Runnable().....)
}
@Override
public void negativeButtonPressed(){
}; // This will not be required
@Override
public void cancelled(){
}; // This will not be required
});
}
@Override
public void render() {
super.render();
}
public void dispose() {
super.dispose();
}
public void pause() {
super.pause();
}
}
我认为我最初打算写的内容要多得多。它可能看起来令人生畏,但实际上相当简单。好吧,在你完成之后,一切看起来都更简单了:)。
这种努力的好处是,在你创建了这个接口之后,对 android 小部件的任何调用都将非常容易并且线程安全。
希望能拍出好照片。