Доступ к диалогу, запущенному в потоке пользовательского интерфейса в плагине Phonegap - PullRequest
2 голосов
/ 27 января 2012

Я новичок в разработке для Android, мне нужно было реализовать собственный диалоговый плагин, похожий на тот, что был в плагине ChildBrowser .

Хотя мне удалось реализовать большую часть функциональных возможностей для этого диалога, включая события обратного вызова 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);
}

Я пытался создать Handler внутри Runnable и вызывать его для обработки сообщения, отправленного с updateData, но, видимо, я что-то не так делаю.

Может быть, я слишком усложняю вещи, и есть более простой способ выполнить обновление данных с помощью обратного вызова JS?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

ОК, вот решение (с использованием Пост ), которое наконец-то сработало для меня (параметр функции / возвращаемое значение не такой, как в моем исходном вопросе, но это все еще та функция, которой я былспрашиваю)

1004 *
1 голос
/ 27 января 2012

Код для плагина Android ChildBrowser может помочь вам, так как он также открывает диалоговое окно в плагине PhoneGap.

https://github.com/phonegap/phonegap-plugins/blob/master/Android/ChildBrowser/src/com/phonegap/plugins/childBrowser/ChildBrowser.java

В зависимости от того, что вы пытаетесь обновить, если у вас есть ссылка на представление, которое вы хотите обновить в основном классе плагинов, у вас должно быть все в порядке.

...