在新浏览器中打开webview

时间:2011-04-06 05:08:01

标签: android webview

我正在实施webview。我想在网页顶部有两个按钮。

我有一个垂直线性布局,其中一个是带有两个按钮的水平布局,另一个是水平布局外的webview。

我只是用Java代码加载Google URL。

每次运行应用程序时,它都会在应用程序顶部打开一个新浏览器,并隐藏按钮。它没有显示webview上方的按钮。 请帮忙告诉我如何在不打开其他浏览器的情况下在webview中加载URL,或者如何通过打开本机浏览器来阻止它,以便页面加载到webview本身而不是新浏览器。

全部谢谢

9 个答案:

答案 0 :(得分:47)

雅。您必须在此课程中实施WebViewClient课程和Override shouldOverrideURLLoading()方法。

为什么?因为webview只是打开你的“完全链接”,如果该链接重定向其他链接,android将打开此操作的默认浏览器。

在您的示例中,如您所知,当您连接到google.com时,Google会重定向到您所在国家/地区的Google。例如,如果您在中国,谷歌将转到google.com.cn,如果在越南,则为google.com.vn

这是我的简单例子:(你可以想象这是一个新的浏览器,:笑)

首先是布局xml文件:

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

    <LinearLayout
        android:layout_height="wrap_content"
        android:layout_width="wrap_content">

        <EditText 
            android:id="@+id/url"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:layout_weight="1"
            android:hint="Input URL"/>

        <Button 
            android:id="@+id/run"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:layout_weight="0"
            android:text="GO"/>

    </LinearLayout>

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

</LinearLayout>

以下是主要活动的代码:

package com.basic;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;

public class WebViewExample extends Activity{ 

    WebView webView;

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

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

        Button button = (Button) findViewById (R.id.run);
        button.setOnClickListener(new OnClickListener() {           
            @Override
            public void onClick(View v) {
                gotoPage();             
            }
        });

    }

    private void gotoPage(){

        EditText text = (EditText) findViewById(R.id.url);
        String url = text.getText().toString();

        WebSettings webSettings = webView.getSettings();
        webSettings.setBuiltInZoomControls(true);

        webView.setWebViewClient(new Callback());  //HERE IS THE MAIN CHANGE
        webView.loadUrl(url);

    }

    private class Callback extends WebViewClient{  //HERE IS THE MAIN CHANGE. 

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return (false);
        }

    }

}

希望这可以帮助你:)

答案 1 :(得分:21)

在loadUrl()之前添加以下代码将解决此问题,

wv.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
          view.loadUrl(url);
          return true;
           }}); 

WebViewClient的shouldOverrideUrlLoading()可以完成这项工作。这里是关于shouldOverrideUrlLoading的Android文档,

在新的URL即将加载到当前WebView中时,为主机应用程序提供接管控制权的机会。如果未提供WebViewClient,则默认情况下WebView将要求活动管理器为URL选择正确的处理程序。如果提供了WebViewClient,则返回true表示主机应用程序处理url,而return false表示当前WebView处理该URL ...

http://developer.android.com/reference/android/webkit/WebViewClient.html#shouldOverrideUrlLoading%28android.webkit.WebView,%20java.lang.String%29

答案 2 :(得分:10)

我的XML实现:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
    android:layout_height="match_parent">

<WebView
    android:background="@android:color/transparent"
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></WebView>
</RelativeLayout>

我的Java实现:

WebView webView;
public final String GlobalUrl = "http://slashdot.org/";

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

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

private void loadWebViewLoad(WebView webview) {
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webview.getSettings().setSupportMultipleWindows(true);
    webview.setWebViewClient(new WebViewClient());
    webview.setWebChromeClient(new WebChromeClient());
    webview.loadUrl(GlobalUrl);
}

最终结果是:

Example image

答案 3 :(得分:3)

布局应该与此类似:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                 android:layout_height="fill_parent"
                 android:layout_width="fill_parent"
                 android:orientation="vertical">
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">
            <Button android:id="@+id/button1"
                android:layout_width="0dip"
                android:layout_height="wrap_content"                
                android:layout_gravity="top"
                android:layout_weight="1"/>
            <Button android:id="@+id/button2"
                android:layout_width="0dip"
                android:layout_height="wrap_content"                
                android:layout_gravity="top"
                android:layout_weight="1" />
        </LinearLayout>
        <WebView 
            android:id="@+id/webview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>
</LinearLayout>

您还可以参考Need help changing from stock android browser to webview查看您是否正确启动了网址。

答案 4 :(得分:3)

我遇到了完全相同的问题,幸运的是,在浏览网页大约一个小时后,我混合了一些我找到的东西并且它有效。

这是代码:

WebView webView;
webView = ((WebView) rootView.findViewById(R.id.detail_area));
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl(mItem.link);

其中&#34; detail_area&#34;是我的webview,rootView是我在#34; Master / Detail Flow&#34;中选择的项目,link是我想要打开的URL。

答案 5 :(得分:2)

我试过这个。它为我工作。它没有打开新窗口。它只会打开webview页面。它为新浏览器隐藏窗口打开...

private WebView webView;
String strUrl="url" ;

webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(strUrl);
webView.setWebViewClient(new WebViewClient());

答案 6 :(得分:1)

在xml文件中添加以下行,其中包含webview

tools:context=".MyActivity"(您的活动名称)

答案 7 :(得分:0)

这可能是一篇较晚的文章,但可能会对其他开发人员有所帮助...

您需要先在 webview 上设置 setWebViewClient ,然后才能像下面那样加载URL,

webview.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return false;
    }
});

上面代码的某些背景,文档使用类似于以下有关 shouldOverrideUrlLoading 方法的文字表示。

 * @param view The WebView that is initiating the callback.
 * @param request Object containing the details of the request.
 * @return {@code true} if the host application wants to leave the current WebView
 *         and handle the url itself, otherwise return {@code false}.
 */
@Override
@SuppressWarnings("deprecation") // for invoking the old shouldOverrideUrlLoading.
@RequiresApi(21)
public boolean shouldOverrideUrlLoading(@NonNull WebView view,
        @NonNull WebResourceRequest request) {
    if (Build.VERSION.SDK_INT < 21) return false;
    return shouldOverrideUrlLoading(view, request.getUrl().toString());
}

如果您看到上面有关返回值的文档,它说,

@return {@code true} if the host application wants to leave the current WebView
  *and handle the url itself, otherwise return {@code false}.

所以它只是说,如果您从 shouldOverrideUrlLoading 方法返回 true ,它将要求设备的默认浏览器处理打开URL的请求,如果您返回 false ,则您的URL仅通过Webview加载。

现在,您可以在此 setWebViewClient 调用之后在Webview中加载URL,或者还可以在返回值之前在 shouldOverrideUrlLoading 方法中加载URL。

答案 8 :(得分:-1)

此代码对我有用 谢谢...

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

    wbView.getSettings().setJavaScriptEnabled(true);
    wbView.setWebViewClient(new WebViewClient());
    wbView.loadUrl("http://ppid.polinela.ac.id");