2016-03-25 15 views
0

私はWebViewに基づいていくつかのシンプルなアプリケーションを開発しようとしており、アンドロイドアプリとリモートページの間でデータを交換できるようにしています。外部からonCreateで宣言されたWebviewにアクセスする方法は?

問題の説明:

loadUrlはのonCreateの中に動作しますが、のonCreateの外から働いていません。それはWebAppInterfaceクラス内で作業していない理由を、以下のコードを見て、私が間違っているのかを説明してください:

public class MainActivity extends Activity { 
    public WebView view1; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     String url = "htxx://mydomain.com/"; 
     final WebView view1 =(WebView) this.findViewById(R.id.webView); 
     view1.addJavascriptInterface(new WebAppInterface(this), "Android"); //exchange between web-js and webview 
     WebSettings webSettings = view1.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     view1.loadUrl(url); 
     view1.setWebViewClient(new com.example.project.MyAppWebViewClient() { 
      @Override 
      public void onPageFinished(WebView view1, String url) { 
       findViewById(R.id.progressBar1).setVisibility(View.GONE); 
       findViewById(R.id.webView).setVisibility(View.VISIBLE); 
      } 
     }); 
     view1.setInitialScale(100); 

     ///// ---> That's works: 
     view1.setWebViewClient(new WebViewClient() { 
      public void onPageFinished(WebView view, String url) { 
       view1.loadUrl("javascript:somescript('Page is loaded')"); 
      } 
     }); 

     ///// ---> That's works too: 
     Button btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
       String device_id = tm.getDeviceId(); 
       view1.loadUrl("javascript:somescript('"+device_id+"')"); 
      } 
     }); 
    } 

    public class WebAppInterface { 
     Context mContext; 
     WebAppInterface(Context c) { 
      mContext = c; 
     } 

     @JavascriptInterface 
     public void showToast(String toast) { 
      //show toast from web-app (js to android) 
      Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); 
     } 

     @JavascriptInterface 
     public void printFromWeb() { 
      //show toast from web-app (js to android) 

      ///// ---> That's NOT working :(
      view1.loadUrl("javascript:somescript('Checking loadurl from outside of onCreate')"); 
     } 
    } 
} 

興味深い、いないエラーがAndroidのスタジオで発生していること。

答えて

2

フィールドにはpublic WebView view1;があり、完全に異なる最終view1onCreate()の中にあるので、実際はpublic void printFromWeb()メソッドではnullです。ここで


は行くための安全なルートである:

"外から" のWebViewにアクセスするには、WebViewのクラスのprivateフィールドを追加します。それをインスタンス化し、あなたのonCreate()方法で

private WebView webView; 

を:

webView = (WebView) findViewById(R.id.webView); 

インスタンスにアクセスするゲッターメソッドを追加します。

public WebView getWebView() { 
    return webView; 
} 

UIスレッドでのみタッチするようにしてください。


更新:安全でない-UIスレッドからのビューにアクセスする方法:

MainActivity.this.runOnUiThread(new Runnable() { 
    @Override 
    public void run(){ 
     view1.loadUrl(...) 
    } 
}) 
+0

はどうもありがとうございました、今それが仕事です!しかし、私はあなたの最後の勧告を理解していない、と私はlogcatで同じメッセージを(説明したように)得る:_Warning:WebViewメソッドがスレッド 'WebViewCoreThread'で呼び出されました。すべてのWebViewメソッドは、UIスレッドで呼び出す必要があります。 WebViewの将来のバージョンは他のスレッドでの使用をサポートしていない可能性があります。_ – deeplay

+1

@deeplay、問題は外部UIスレッドからのView子孫の呼び出しメソッドがルールを破っていることです。 [http://nickthecoder.wordpress.com/2013/01/31/updating-ui-from-another-thread-in-android](ここ)は、それをもっとはっきりさせるべきです。その間、関連するスニペットで投稿を更新します – xAF

+0

_ [OOPS!そのページは見つかりません。](https://nickthecoder.wordpress.com/2013/01/31/updating-ui-from-another-thread-in-androi%E2%80%8C%E2%80% 8Bd)_ – deeplay

関連する問題