gpt4 book ai didi

java - 访问在 Phonegap 插件的 UI 线程上运行的对话框

转载 作者:搜寻专家 更新时间:2023-11-01 09:09:52 24 4
gpt4 key购买 nike

我是 Android 开发新手,我需要实现类似于 ChildBrowser plugin 中的自定义对话框插件.

虽然我已经设法实现了此对话框的大部分功能,包括某些对话框操作的 JS 回调事件,但我无法实现在显示时将数据从 JS 发送回对话框。

场景如下:当对话框的 Spinner 改变时,调用 JS 回调,JS 代码执行一些处理(访问 sqlStorage 数据等),然后我需要更新对话框的一些 View 。我当前的代码(没有不相关的东西):

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 回调完成数据更新?

提前谢谢你。

最佳答案

好的,这是一个最终对我有用的解决方案(使用 Post )(函数的参数/返回值与我原来的问题不一样,但这仍然是我问的函数):

protected void updateData(String data) {
mMyEdit.post(
new Runnable() {
public void run() {
mMyEdit.setText(data);
}
}
);
}

关于java - 访问在 Phonegap 插件的 UI 线程上运行的对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9027990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com