2017-06-05 6 views
0

アンカータグを含むウェブサイトを読み込むwebviewがあります。このアンカータグのタイプは「noreferrer」で、新しいタブでページを開きます(target = "_blank"を使用)。今問題は、私がwebviewでマルチウィンドウサポートを有効にしないときです。すべてのデバイスでうまく動作します。リンクタイプが "noreferrer"の場合、Android M Webview(マルチウィンドウサポートを有効にする)でアンカータグを開けません。

マルチウィンドウサポートを有効にすると、マシュマロデバイスでは機能しませんが、他のすべてのデバイスで正常に動作します。私はそれを再現するためにdemo projectを作成しました。アンカータグからrel = "noreferrer"を削除すると、すべての場合に正常に動作します。

My活動コードは、ここで

public class MainActivity extends AppCompatActivity { 

    private RelativeLayout mContainer; 
    private WebView mWebView; 
    private WebView mNewWebView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mContainer = (RelativeLayout) findViewById(R.id.container); 
     mWebView = (WebView) findViewById(R.id.webview); 

     WebSettings webSettings = mWebView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     webSettings.setJavaScriptCanOpenWindowsAutomatically(true); 
     webSettings.setSupportMultipleWindows(true); 

     mWebView.setWebChromeClient(new WebChromeClient() { 
      @Override 
      public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { 
       mNewWebView = new WebView(MainActivity.this); 
       mNewWebView.setLayoutParams(new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.MATCH_PARENT, 
        RelativeLayout.LayoutParams.MATCH_PARENT 
       )); 

       WebSettings webSettings = mNewWebView.getSettings(); 
       webSettings.setJavaScriptEnabled(true); 
      webSettings.setJavaScriptCanOpenWindowsAutomatically(true); 

       mNewWebView.setWebViewClient(new WebViewClient() { 
        @Override 
        public void onPageFinished(WebView view, String url) { 
         super.onPageFinished(view, url); 
         view.clearHistory(); 
        } 
       }); 
       mContainer.addView(mNewWebView); 

       ((WebView.WebViewTransport) resultMsg.obj).setWebView(mNewWebView); 
       resultMsg.sendToTarget(); 

       return true; 
      } 
     }); 
     mWebView.setWebViewClient(new WebViewClient()); 

     mWebView.loadData("<a href=\"https://example.com\" target=\"_blank\" rel=\"noreferrer\">open new window</a>", 
      "text/html", "utf-8"); 
    } 

    @Override 
    public void onBackPressed() { 
     if (mNewWebView != null) { 
      if (mNewWebView.canGoBack()) { 
       mNewWebView.goBack(); 
      } else { 
       mNewWebView.destroy(); 
       mContainer.removeViewAt(1); 
       mNewWebView = null; 
      } 
     } else if (mWebView != null && mWebView.canGoBack()) { 
      mWebView.goBack(); 
     } else { 
      super.onBackPressed(); 
     } 
    } 
} 

マイレイアウトファイル

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.treebo.test.MainActivity"> 

    <WebView 
     android:id="@+id/webview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</RelativeLayout> 

いくつかのポインタです:

  • マルチウィンドウのサポートI webview.getSettings()。setSupportMultipleWindows(true)を使用して有効にします。私はこの1つのwebviewレイアウトファイルを定義しています。
  • アンカーをクリックすると、新しいページが開き、onCreateWindow()が呼び出され、新しいWebviewを作成してビュー階層に追加します。

編集1

アンドロイド5.0.2この上

編集2

いくつかの明確化で同じ問題を観察した:私は、Webページを開き、いくつかのユースケースを持っていますブラウザの別のタブ(基本的に支払い関連のページ)に表示されます。同じWebサイトをWebビューで実行すると、同じWebビューで新しいタブが開きます(これは新しいWebビューで開きます)。そのため、私はマルチウィンドウサポートを使用しています。マルチウィンドウサポートを使用している理由をクリアしたいと思っています。

+0

PROヒント のままでいることを確認します、あなたは(それが速く答えを得ることはありません)立ち往生してきたどのくらいの時間を教えてする必要はありませんがもあなたはそれを解決するために何も(あなたがそれを解決した場合、あなたは聞いていないだろう)、また助けを明示的な要求を(あなたがここにいる理由はおそらくです)を見つけることができませんでした。できれば短くて簡潔にしてください。チャットが多すぎると読者の読書が妨げられることがあります。 – halfer

+1

ありがとうございます。次回これらの事のすべての:) –

答えて

0

あなたは

を言うこのアンカータグは「noreferrer」の種類があり、(ターゲット=「_blank」を使用して)新しいタブでページを開きます。

これはHTMLタグですか?あなたはアンドロイドで新しいHTMLページや新しい断片を開こうとしていますか?あなたはそれが何を意味するのか分からないので?

あなたがここにAPIレベル23以下のためのマルチウィンドウのサポートについての詳細情報を見つけることができます:https://developer.android.com/guide/topics/ui/multi-window.html#testing

アプリのターゲットのAPIレベル23以下 もしあなたのアプリがAPIレベル23以下であり、ターゲットにしている場合ユーザーがマルチウィンドウモードでアプリを使用しようとすると、アプリが一定の方向を宣言しない限り、アプリはアプリのサイズを強制的に変更します。

アプリが固定方向を宣言していない場合は、Android 7を搭載した端末で アプリを起動する必要があります。0以上で、アプリを分割画面モードで に入れようとします。アプリのサイズを強制的に変更したときのユーザーエクスペリエンスが であることを確認します。

アプリが固定されたオリエンテーションを宣言した場合は、マルチウィンドウモードで アプリを入れしようとしなければなりません。あなたがそうするとき、アプリはフルスクリーンモードでの投稿のため

+0

初の世話をします、コメントではなく解答セクションに質問をします。添付されているプロジェクトのリンクを確認することができます。私は断片や活動を開始していません。 Htmlページには、この属性rel = "noreferrer"を持つアンカータグがあります。このアンカータグをクリックすると、新しいタブに新しいHTMLページが開きます。デフォルトでは、新しいページが同じwebviewで開きます。しかし、新しいwebviewで開くには、マルチウィンドウサポートを有効にする必要があります。 –

+0

あなたの質問は私には分かりませんでした。私はwebviewで自分の複数のHTMLページを使用しています。私はマルチウィンドウサポートを使用していません。 rel = "norefferrer"の代わりに。余分なクラスを追加してください。代わりにjavascriptで行うと、問題はありません。 – Steven

+0

htmlアンカータグで "_blank"とは何か分かりますか?ブラウザの別のタブ(基本的に支払い関連のページ)にWebページを開くユースケースがいくつかあります。同じWebサイトをWebビューで実行すると、同じWebビューで新しいタブが開きます(これは新しいWebビューで開きます)。そのため、私はマルチウィンドウサポートを使用しています。質問がクリアされることを願っています。 –

関連する問題