2012-01-27 6 views
2

私は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コールバックからデータを更新するのが簡単な方法がありますか?

ありがとうございます。

答えて

2

これは最終的に私のために働いた解決策です(Post)。関数/戻り値のパラメータは私の元の質問と同じではありませんが、依然として私が求めていた関数です。

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

Android ChildBrowserプラグインのコードは、PhoneGapプラグインでダイアログを開くときに役立ちます。あなたは、あなたは大丈夫でなければなりませんメインのプラグインクラスに更新したいビューへの参照を持っている場合、更新しようとしている内容に応じて

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

+0

返信いただきありがとうございます。 'ChildBrowser'は、起動後にダイアログボックスを外部から更新することを許可していません。もちろん、メインプラグインクラスのビュー参照を保存してからupdateDataメソッドで使用しようとしましたが、「ビュー階層を作成した元のスレッドのみがビューにアクセスできます」エラー。 – Tiger

+0

このリンクは壊れています:( –

関連する問題