2012-01-11 12 views
0

匿名のBroadcastReceiverがWebView内のリンクに応答します。私はインテントフィルターでこれを行うことができると思ったが、物事は機能していない。ここに私の活動のためのコードは次のとおりです。ここでWebViewと匿名のBroadcastReceiverがアクティビティで通信中に問題が発生しました。

public class WebViewReceiverActivity extends Activity { 

    private BroadcastReceiver mReceiver; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

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

     webView.loadData("<a href=\"webview-receiver:///\">This should Toast</a>", "text/html", "utf8"); 

     mReceiver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       Uri data = intent.getData(); 
       if (data != null && data.getScheme().equals("webview-receiver")) { 
        Toast.makeText(WebViewReceiverActivity.this, "Toasty", Toast.LENGTH_SHORT).show(); 
       } 
      } 

     }; 

     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(Intent.ACTION_VIEW); 
     intentFilter.addCategory(Intent.CATEGORY_DEFAULT); 
     intentFilter.addCategory(Intent.CATEGORY_BROWSABLE); 
     intentFilter.addDataScheme("webview-receiver"); 

     registerReceiver(mReceiver, intentFilter); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 

     unregisterReceiver(mReceiver); 
    } 


} 

はmain.xmlレイアウトです:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <WebView 
     android:id="@+id/webview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:scrollbarStyle="insideOverlay" /> 

</LinearLayout> 

私はページが見つからないというエラーなしトーストを取得するのWebView内のリンクをクリックすると。このアプローチは可能ですか?私はWebViewClientとshouldOverrideUrlLoading()を代わりに使用することを考えていますが、BroadcastReceiverのアプローチを私が好むよりもうまく動作させることができればと思います。

答えて

0

ウェブビューでクリックに応答するには、JavaインタフェースにはJavaScriptを使用して、私はBroadcastReceiverとWebViewClient間のハイブリッドアプローチをやってしまった:

webView.setWebViewClient(new WebViewClient() { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     Uri uri = Uri.parse(url); 
     if (uri.getScheme().equals("webview-receiver")) { 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(uri); 

      sendBroadcast(intent); 

      return true;  
     } 

     return false; 
    } 
}); 

私は私が取り組んでいる現在のコードベースの制約のためにこれを行う。 shouldOverrideUrlLoading()メソッドでBroadcastReceiver onReceive()メソッドのすべてのロジックを実行するほうがずっと簡単です。

1
+0

これは間違いなくそれを行う方法ですが、私の問題は私の例よりも少し複雑です(申し訳ありません)。私はコントロールしていないサーバーから外部HTMLを読み込み、WebViewにカスタムJavaScriptを読み込むことはできません。 –

関連する問題