私はAndroid開発には新しく、ChildBrowser pluginのようなカスタムダイアログプラグインを実装する必要がありました。PhonegapプラグインのUIスレッドで実行されているダイアログにアクセスする
特定のダイアログアクションでJSコールバックイベントを含むこのダイアログのほとんどの機能を実装していましたが、表示中にJSからダイアログにデータを戻して実装することができませんでした。
ダイアログのSpinnerが変更されたときにJSコールバックが呼び出され、JSコードが何らかの処理(sqlStorageデータへのアクセスなど)を実行した後、ダイアログのいくつかのビューを更新する必要があります。 (非関連のものなし)私の現在のコード:
CustomDialogPlugin.java:
public class CustomDialogPlugin extends Plugin {
@Override
public PluginResult execute(String action, JSONArray args, String callbackId) {
PluginResult.Status status = PluginResult.Status.OK;
String result = "";
try {
if (action.equals("show")) {
result = this.showDialog(args.optJSONObject(0), callbackId);
// ...
} else if (action.equals("update")) {
this.updateData(args.optJSONObject(0));
}
} catch(JSONException e) {
// ...
}
}
// Show the dialog
public String showDialog(JSONObject options, final String callbackId) {
if (options != null) {
// Handle options
}
// Create the child dialog in new thread
Runnable runnable = new Runnable() {
public void run() {
mDialog = new Dialog(ctx);
// Dialog layouts, views and listeners setup
// ...
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView adapter, View v, int i, long lng) {
// ...
// Prepare JSON data to send and call a callback
sendUpdate(CHANGED_EVENT, obj, true);
}
@Override
public void onNothingSelected(AdapterView adapter) {
// ...
}
});
// ...
mDialog.show();
}
};
this.ctx.runOnUiThread(runnable);
return "";
}
// Create a new plugin result and send it back to JavaScript
private void sendUpdate(int eventType, JSONObject obj, boolean keepCallback) {
if (this.savedCallbackId != null) {
// ...
PluginResult result = new PluginResult(PluginResult.Status.OK, obj);
Result.setKeepCallback(keepCallback);
this.success(result, this.savedCallbackId);
}
}
// Parse data received from JS and upate dialog
protected String updateData(JSONObject data) {
// Here I need to update some views of mDialog
// Can't access them from here
}
}
customdialog.js:
var CustomDialog = function() {};
CustomDialog.CHANGED_EVENT = 1;
CustomDialog.prototype.show = function(data) {
return PhoneGap.exec(this._onEvent, this._onError, 'CustomDialogPlugin', 'show', [data]);
};
CustomDialog.prototype.update = function(data) {
return PhoneGap.exec(this._onEvent, this._onError, 'CustomDialogPlugin', 'update', [data]);
};
CustomDialog.prototype._onEvent = function(data) {
if (data.type == CustomDialog.CHANGED_EVENT && typeof window.plugins.CustomDialog.onChange === "function") {
window.plugins.CustomDialog.onChange(data);
}
// ...
};
CustomDialog.prototype._onError = function(data) {
// ...
};
PhoneGap.addConstructor(function() {
PhoneGap.addPlugin('customDialog', new CustomDialog());
});
test.htmlという:
// ...
window.plugins.customDialog.onChange = function(data) {
// ...
window.plugins.customDialog.update(some_other_data);
}
Runnable
の中にHandler
を作成しようとしましたが、それをupdateData
から送信されたメッセージを処理するために呼び出そうとしましたが、明らかに何か間違っています。
多分私は複雑すぎて、JSコールバックからデータを更新するのが簡単な方法がありますか?
ありがとうございます。
返信いただきありがとうございます。 'ChildBrowser'は、起動後にダイアログボックスを外部から更新することを許可していません。もちろん、メインプラグインクラスのビュー参照を保存してからupdateDataメソッドで使用しようとしましたが、「ビュー階層を作成した元のスレッドのみがビューにアクセスできます」エラー。 – Tiger
このリンクは壊れています:( –