Android M Webview(启用多窗口支持)在链接类型为“时不打开锚定标记”;“诺弗勒”;

Android M Webview(启用多窗口支持)在链接类型为“时不打开锚定标记”;“诺弗勒”;,android,android-webview,anchor,Android,Android Webview,Anchor,我有一个webview,它加载一个包含一些锚定标签的网站。此锚定标记的类型为“noreferrer”,并在新选项卡中打开一页(使用target=“\u blank”)。现在的问题是,当我没有在webview中启用多窗口支持时,它可以在所有设备上正常工作 但当我启用多窗口支持时,它在棉花糖设备中不起作用,但在所有其他设备中都可以正常工作。我已经创造了一个复制它。当我从锚标记中删除rel=“noreferrer”时,它在所有情况下都可以正常工作 我的活动代码在这里 public class Main

我有一个webview,它加载一个包含一些锚定标签的网站。此锚定标记的类型为“noreferrer”,并在新选项卡中打开一页(使用target=“\u blank”)。现在的问题是,当我没有在webview中启用多窗口支持时,它可以在所有设备上正常工作

但当我启用多窗口支持时,它在棉花糖设备中不起作用,但在所有其他设备中都可以正常工作。我已经创造了一个复制它。当我从锚标记中删除rel=“noreferrer”时,它在所有情况下都可以正常工作

我的活动代码在这里

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>
public类MainActivity扩展了AppCompatActivity{
私人亲戚;
私有网络视图;
私有网络视图;
@凌驾
创建时受保护的void(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();
setJavaScriptEnabled(true);
setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(真);
mWebView.setWebChromeClient(新WebChromeClient(){
@凌驾
public boolean onCreateWindow(WebView视图、boolean isDialog、boolean IsUser手势、Message ResultsMg){
mNewWebView=newwebview(MainActivity.this);
MNEWEBVIEW.setLayoutParams(新的RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_父级,
RelativeLayout.LayoutParams.MATCH_父项
));
WebSettings WebSettings=mNewWebView.getSettings();
setJavaScriptEnabled(true);
setJavaScriptCanOpenWindowsAutomatically(true);
mNewWebView.setWebViewClient(新的WebViewClient(){
@凌驾
公共void onPageFinished(WebView视图,字符串url){
super.onPageFinished(视图、url);
view.clearHistory();
}
});
mContainer.addView(mnewebview);
((WebView.WebView传输)resultsg.obj).setWebView(mNewWebView);
结果sg.sendToTarget();
返回true;
}
});
setWebViewClient(新的WebViewClient());
mWebView.loadData(“,
“文本/html”、“utf-8”);
}
@凌驾
public void onBackPressed(){
如果(mNewWebView!=null){
if(mNewWebView.canGoBack()){
mNewWebView.goBack();
}否则{
mNewWebView.destroy();
mContainer.removeViewAt(1);
mNewWebView=null;
}
}else if(mWebView!=null&&mWebView.canGoBack()){
mWebView.goBack();
}否则{
super.onBackPressed();
}
}
}
我的布局文件

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>

很少有指针:

  • 使用webview.getSettings().setSupportMultipleWindows(true)启用多窗口支持。我正在做这一个webview定义了一个布局文件
  • 当我单击锚点时,它会打开一个新页面,并调用onCreateWindow(),在这里我创建了一个新的webview并将其添加到视图层次结构中
编辑1

在安卓5.0.2上也发现了同样的问题

编辑2

对此有一些澄清:我有一些用例,它在浏览器中的一个单独选项卡中打开一个网页(基本上是与支付相关的页面)。当我在web视图中运行同一个网站时,它会在同一个web视图中打开新选项卡(我不希望这样,我想在新的web视图中打开它)。这就是我使用多窗口支持的原因。希望它能澄清我为什么使用多窗口支持。

你说

此锚定标记的类型为“noreferrer”,并在新选项卡中打开一页(使用target=“\u blank”)

那是HTML标记吗?你是想在android中打开一个新的HTML页面还是一个新的页面?因为我不明白你的意思

您可以在此处找到有关api级别23或更低版本的多窗口支持的更多信息:

如果您的应用程序目标API级别为23或更低 如果您的应用程序的目标API级别为23或更低,并且用户试图在多窗口模式下使用该应用程序,则系统将强制调整该应用程序的大小,除非该应用程序声明固定方向

如果您的应用程序未声明固定方向,则应启动 您的应用程序安装在运行Android 7.0或更高版本的设备上,并尝试将 应用程序处于分屏模式。验证用户体验是否正常 强制调整应用程序大小时可接受

如果应用程序声明了一个固定方向,您应该尝试将 应用程序处于多窗口模式。验证在执行此操作时,应用程序是否仍然有效 全屏模式


专业贴士:没有必要告诉我们你被困多久了(没有更快的答案),也没有必要告诉我们你找不到任何解决办法(如果你解决了,你就不会要求),也没有明确的帮助请求(这可能就是你来这里的原因)。如果可以的话,尽量保持简短-太多的聊天会阻止人们阅读。谢谢。下次我会处理这些事情:)首先,在评论中提问,而不是在回答部分。您可以检查附加的项目链接。我不会打开任何片段或活动。Html页面有一个锚定标记,该标记具有以下属性rel=“noreferrer”。单击此锚定标记后,它将在“新建”选项卡中打开一个新的html页面。默认情况下,新页面将在同一webview中打开。但要在新的webview中打开它,我们必须启用多窗口支持。我不清楚你的问题。我