的問題是,你正在嘗試創建一個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