的问题是,你正在尝试创建一个Android小部件,我怀疑你是在Libgdx核心实现中做的。核心实现没有任何对Android SDK的引用。
这是因为它是继承了核心项目的Android项目。因此,核心项目并不知道加载到Android实现的任何依赖关系。
为了克服这个问题,您需要在Android项目和Core Project之间创建一个接口。这将允许您调用Android项目中的方法。 必须在核心项目中创建接口,以便两个项目都可以访问它。
例如,在核心项目中创建CrossPlatformInterface.java。但首先让我们创建一个回调以获取来自Libgdx线程内的Ui线程的反馈。 重要的是要记住,Libgdx有一个独立的线程,Android主线程!如果您尝试从Libgdx线程运行Android的Widgets,应用程序将粉碎。
让我们对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
}
核心项目还创造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来确保AlertDialog是在ui线程中创建的。
最后如何执行这样的:
的Android主活动内部
实例化跨平台接口并通过活动到它的MyGdxGame内部传递的接口实例:
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是创建我们得到的crossplatform接口的实例,我们可以调用任何我们想要的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 widget的调用非常简单和线程安全。
希望它能给出一个好的照片。
这就是我要做的。但说实话,这是一场噩梦!只要看看代码。为弹出式输入所有内容是否公平? – Arash 2015-03-19 18:03:16
这是非常复杂的,有很多的依赖关系,进口,即无法解决。有没有更简单的解决方案? – plaidshirt 2015-03-19 23:09:02
您可以将所有皮肤存储在json文件中。只需找到一些教程。代码会少得多。 ;) – Aleksandrs 2015-03-20 04:34:40