アンカータグを含むウェブサイトを読み込む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ビューで開きます)。そのため、私はマルチウィンドウサポートを使用しています。マルチウィンドウサポートを使用している理由をクリアしたいと思っています。
PROヒント のままでいることを確認します、あなたは(それが速く答えを得ることはありません)立ち往生してきたどのくらいの時間を教えてする必要はありませんがもあなたはそれを解決するために何も(あなたがそれを解決した場合、あなたは聞いていないだろう)、また助けを明示的な要求を(あなたがここにいる理由はおそらくです)を見つけることができませんでした。できれば短くて簡潔にしてください。チャットが多すぎると読者の読書が妨げられることがあります。 – halfer
ありがとうございます。次回これらの事のすべての:) –