2011-10-05 32 views
5

Có thể gọi các phương thức hoạt động chính từ giao diện JavaScript của đối tượng WebView không? Hoặc để truy cập SharedPreferences từ giao diện này để tôi có thể đọc dữ liệu với hoạt động của mình? Tôi muốn cho Hoạt động của tôi biết rằng một hành động JavaScript cụ thể đã xảy ra.Android WebView: các phương thức hoạt động gọi là giao diện JavaScript

+0

bản sao có thể có của [Thêm giao diện JavaScript vào trình duyệt] (http://stackoverflow.com/questions/3765860/adding-javasc ript-interface-to-a-browser) – skolima

Trả lời

3

Có, liên lạc hai chiều giữa JavaScript và ứng dụng của bạn là có thể thông qua WebView.addJavascriptInterface(). Kiểm tra ví dụ này:

http://android-developers.blogspot.com/2008/09/using-webviews.html

+0

OK, loại giải quyết vấn đề của tôi. Trong ví dụ được đưa ra bởi bạn nó hoạt động, bởi vì DemoJavaScriptInterface là một lớp con của lớp WebViewDemo và có thể truy cập các phương thức của nó. Nhưng liệu có cách nào để đạt được nó khi nó không phải là một phân lớp? – Krzychu

+0

Nó không sử dụng bất kỳ phương thức 'WebViewDemo' nào. Nó chỉ sử dụng 'mHandler' và nó có thể được truyền cho constructor. – Caner

+0

Tôi đã cố gắng chuyển 'mHandler' nhưng hoạt động chính vẫn không thể truy cập được. Khi tôi thử 'mHandler.post (Runnable mới() { chạy void công khai() { mWebView.loadUrl (" javascript: wave() "); } }); 'Tôi nhận được _myWebView không thể được giải quyết_ – Krzychu

1

Bạn có thể sử dụng WebView.addJavascriptInterface chức năng để đạt được điều này. Thông tin thêm: In Google documentation

+0

Có, tôi đang sử dụng addJavascriptInterface (new JavaScriptInterface (this), "Android"); Câu hỏi đặt ra là: làm thế nào để gọi phương thức hoạt động chính từ bên trong lớp JavaScriptInterface. – Krzychu

+0

Bạn có thể cập nhật câu hỏi của mình với mã bạn có vào lúc này không? – SERPRO

2

hoạt động của bạn:

/* 
* entry point of the application starting the index.html of PhoneGap 
* */ 

package com.test.my.myApp; 

import org.apache.cordova.DroidGap; 

import android.os.Bundle; 
import android.util.Log; 

import com.google.analytics.tracking.android.EasyTracker; 

public class MyOpelMainActivitiy extends DroidGap 
{ 

    String curPhoneNumber; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     super.setIntegerProperty("splashscreen", R.drawable.splash); 
     super.loadUrl("file:///android_asset/www/app/index.html",15000); 

    } 
    @Override 
    public void onStart() { 
     super.onStart(); 
     this.appView.addJavascriptInterface(new JsInterface(), "android"); 
     curPhoneNumber = "test"; 

     // The rest of your onStart() code. 
     EasyTracker.getInstance().activityStart(this); // Add this method. 
    } 

    @Override 
    public void onDestroy() 
    { 
     super.onDestroy();  
     com.google.analytics.tracking.android.EasyTracker.getInstance().activityStop(this); 
    } 

    public class JsInterface{ 





      public String getPhoneNumber() 
      { 

       // Here call any of the public activity methods.... 
       return curPhoneNumber; 
      } 
     } 
    } 

HTML Markup:

<script type="text/javascript"> 
      alert(android.getPhoneNumber()); 
     </script> 

=================== ================================================== ===

+0

Trong ví dụ này cho api17 + getPhoneNumber phải có chú thích @ android.webkit.JavascriptInterface – MazarD

Các vấn đề liên quan