Как загрузить внешнюю веб-страницу в WebView

Моя проблема в том, что веб-страница не загружается внутри WebView.

mWebview.loadUrl("http://www.google.com"); запускает веб-браузер...

Это код моей активности:

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class Main extends Activity {
    
    private WebView mWebview;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        mWebview = new WebView(this);
        mWebview.loadUrl("http://www.google.com");
        setContentView(mWebview);
    }   
}

Я добавил необходимое разрешение в манифест:

<uses-permission android:name="android.permission.INTERNET" />

person Gilbou    schedule 05.09.2011    source источник
comment
Привет, Гилбоу, ваш код работает в версии 2.2.   -  person Dipak Keshariya    schedule 05.09.2011
comment
Но не со мной :( Ни на HTC Wildfire, ни на Эмуляторе... Я просто не понимаю.   -  person Gilbou    schedule 05.09.2011
comment
Хорошо... теперь это работает. Но он запускает веб-браузер вместо отображения страницы внутри веб-просмотра.   -  person Gilbou    schedule 05.09.2011
comment
Здравствуйте, это означает, что если UR запустить этот код, браузер будет открыт.   -  person Dipak Keshariya    schedule 05.09.2011
comment
Вам действительно нужна ссылка на этот учебник пример веб-просмотра для Android   -  person Athira Reddy    schedule 17.05.2019


Ответы (14)


Благодаря этому сообщению, Я наконец нашел решение. Вот код:

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
import android.annotation.TargetApi;

public class Main extends Activity {

    private WebView mWebview ;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        mWebview  = new WebView(this);

        mWebview.getSettings().setJavaScriptEnabled(true); // enable javascript

        final Activity activity = this;

        mWebview.setWebViewClient(new WebViewClient() {
            @SuppressWarnings("deprecation")
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Toast.makeText(activity, description, Toast.LENGTH_SHORT).show();
            }
            @TargetApi(android.os.Build.VERSION_CODES.M)
            @Override
            public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
                // Redirect to deprecated method, so you can use it in all SDK versions
                onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString());
            }
        });

        mWebview .loadUrl("http://www.google.com");
        setContentView(mWebview );

    }

}
person Gilbou    schedule 05.09.2011
comment
Хорошая вещь, но я хочу, чтобы веб-страница отображалась с умом. Это возможно с помощью веб-просмотра? - person Zala Janaksinh; 16.08.2012
comment
Не забудьте добавить Разрешение ‹uses-permission android:name=android.permission.INTERNET /› - person star18bit; 05.06.2013
comment
На самом деле, чтобы обрабатывать URL-адрес внутри вашего веб-просмотра, вы должны установить webviewclient, если вы не установите клиент, поведение по умолчанию — запустить приложение, которое обрабатывает URL-адреса. См. эту ссылку. - person erdemlal; 22.11.2013
comment
Включение java-скрипта открывает ваше приложение для потенциальных проблем с безопасностью, и я уверен, что Android SDK предупредит вас об этом, когда вы используете его в коде. Не делайте этого, если вы не можете контролировать, какие веб-сайты отображать в своем веб-просмотре, и включение java-скрипта не должно рассматриваться как простое решение. - person LostPuppy; 14.06.2014
comment
Разве onReceivedError не должно быть @Override? - person Adrian Seeley; 21.01.2015
comment
На самом деле нужна только строка mWebview.setWebViewClient(new WebViewClient()); - person Sébastien; 06.02.2017
comment
Код не открывается.. Показывает Webpage not available - person Ranjith Kumar; 19.11.2019
comment
@RanjithKumar У меня работает, но мне пришлось закомментировать setContentView(mWebview ); с конца, потому что это выдавало другую ошибку: У указанного потомка уже есть родитель. Вы должны сначала вызвать removeView() для родителя дочернего элемента - person gregn3; 06.04.2020

попробуй это

webviewlayout.xml:

<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/help_webview"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:scrollbars="none"
/>

В вашей деятельности:

WebView webView;
setContentView(R.layout.webviewlayout);
webView = (WebView)findViewById(R.id.help_webview);
webView.getSettings().setJavaScriptEnabled(true);
webview.loadUrl("http://www.google.com");

Обновить

Добавьте webView.setWebViewClient(new WebViewController()); в свою активность.

Класс WebViewController:

public class WebViewController extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}
person Farhana Haque    schedule 05.09.2011
comment
Извините. Кажется, я что-то изменил в манифесте, и теперь он тоже работает. но все же страница загружается в веб-браузере, а не в веб-просмотре. - person Gilbou; 05.09.2011
comment
у меня сработала эта строка: webView.getSettings().setJavaScriptEnabled(true); - person pixparker; 04.09.2014
comment
mWebview.getSettings().setJavaScriptEnabled(true); сработало для меня, мы должны добавить эту строку - person neena; 18.08.2016
comment
Это плохой способ сделать это. shouldOverrideUrlLoading вызывается для всех страниц, загруженных в веб-просмотре. Это включает в себя iFrame, что означает, что если страница загружает iFrame, страница будет заменена iFrame. Это не рекомендуется на соответствующей странице документов Android. - person Hack5; 13.01.2018

Пожалуйста, используйте этот код: -

Main.Xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:background="@drawable/background">
    <RelativeLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:background="@drawable/top_heading"
        android:id="@+id/rlayout1">
        <TextView android:layout_width="wrap_content"
            android:layout_centerVertical="true" android:layout_centerHorizontal="true"
            android:textColor="#ffffff" android:textSize="22dip"
            android:textStyle="bold" android:layout_height="wrap_content"
            android:text="More Information" android:id="@+id/txtviewfbdisplaytitle" />
    </RelativeLayout>
    <RelativeLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:layout_below="@+id/rlayout1"
        android:id="@+id/rlayout2">
        <WebView android:id="@+id/webview1" android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1.0" />
    </RelativeLayout>
</RelativeLayout>

MainActivity.Java

public class MainActivity extends Activity {
    private class MyWebViewClient extends WebViewClient {
          @Override
          public boolean shouldOverrideUrlLoading(WebView view, String url) {
              view.loadUrl(url);
              return true;
          }
    }
    Button btnBack;
    WebView webview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        webview=(WebView)findViewById(R.id.webview1);
        webview.setWebViewClient(new MyWebViewClient());
        openURL();
    }

     /** Opens the URL in a browser */
    private void openURL() {
        webview.loadUrl("http://www.google.com");
        webview.requestFocus();
    }
}

Попробуйте этот код, если какой-либо запрос спросит меня.

person Dipak Keshariya    schedule 05.09.2011
comment
оно работает. Но ты пропустил 2 вещи. Во-первых, вы не указали, что требуется разрешение на доступ в Интернет. Во-вторых, использование фонового изображения. Благодарность - person Sumon Bappi; 17.10.2015

Это очень просто: попробуйте интегрировать эти строки кода, сначала получите разрешение в файле Android Manifest.

<uses-permission android:name="android.permission.INTERNET" />

затем напишите код в файле Activity.xml.

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

<WebView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/help_webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

/>

</LinearLayout>

Затем напишите этот код в файле MainActivity.java.

import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Window;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends Activity{
    private WebView mWebview ;
    String link = "";// global variable
    Resources res;// global variable
    @Override


      protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_modernherbal_main);
            mWebview  = (WebView) findViewById(R.id.help_webview);
            WebSettings webSettings = mWebview.getSettings();
            webSettings.setJavaScriptEnabled(true);
            webSettings.setUseWideViewPort(true);
            webSettings.setLoadWithOverviewMode(true);



        final Activity activity = this;

        mWebview.setWebViewClient(new WebViewClient() {
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Toast.makeText(activity, description, Toast.LENGTH_SHORT).show();
            }


});

    mWebview .loadUrl("http://www.example.com");

}

}

Попробуйте это, это поможет вам решить вашу проблему

person Pronab Roy    schedule 09.08.2017

просто зайдите в файл XML и дайте идентификатор вашему webView, а затем в java вставьте эту строку:

   public class Main extends Activity {

private WebView mWebview;

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

    mWebview = (WebView)findViewById(R.id.id_you_gave _to_your_wenview_in_xml);
    mWebview.loadUrl("http://www.google.com");
    }   
}
person Ankush Rawat    schedule 24.03.2018

Я использовал этот код, который был крут. но есть ошибка. Если вы используете этот код, отображается сообщение "neterr_cleartext_not_permitted", и вы столкнетесь с этой проблемой.

У меня есть решение этой проблемы. Вы должны добавить это в свой AndroidManifest.xml рядом с Приложением.

android:usesCleartextTraffic="true"
<uses-permission android:name="android.permission.INTERNET" /> // ignore if you already added. outside of Application.
person pankaj kumar    schedule 03.04.2020

Вы можете сделать так.

webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("Your URL goes here");
person KarthikKPN    schedule 21.07.2016

попробуй это;

webView.loadData("<iframe src='http://www.google.com' style='border: 0; width: 100%; height: 100%'></iframe>", "text/html; charset=utf-8", "UTF-8");
person alicanozkara    schedule 25.12.2017

Добавить разрешение на доступ в Интернет в AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />

В вашем макете:

<?xml version="1.0" encoding="utf-8"?>
<WebView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/webView"
 />

В вашей деятельности

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

    try {
        progressDialog = new ProgressDialog(this);
        url_Api = "https://docs.microsoft.com/en-us/learn";

        webView = this.findViewById(R.id.webView);

            progressDialog.setMessage(getString(R.string.connection_Wait));
            progressDialog.setIndeterminate(false);
            progressDialog.setCancelable(true);
            progressDialog.show();

            LoadUrlWebView( url_Api );
    }catch (Exception e){
        Log.w(TAG, "onCreate", e);
    }
}

private void LoadUrlWebView( String url_api ) {
    try {
        webView.setWebViewClient(new WebViewClient());
        webView.setWebChromeClient(new MyWebChromeClient( url_api ));
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setAllowContentAccess(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setDisplayZoomControls(false);

        webView.loadUrl(url_api);
    } catch (Exception e) {
        Log.w(TAG, "setUpNavigationView", e);
    }
}

private class MyWebChromeClient extends WebChromeClient {
    private String urlAccount;

    public MyWebChromeClient( String urlAccount ) {
        this.urlAccount = urlAccount;
    }

    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        try {
            //Tools.LogCat(context, "INSIDE MyWebChromeClient | onProgressChanged / newProgress1:" + newProgress);
            progressDialog.setMessage(newProgress + "% " + getString(R.string.connection_Wait));
            if (newProgress < 100 && !progressDialog.isShowing()) {
                if (progressDialog != null)
                    progressDialog.show();
            }
            if (newProgress == 100) {
                if (progressDialog != null)
                    progressDialog.dismiss();
            }
        }catch (Exception e){
            Log.w( "onProgressChanged", e);
        }
    }

    @Override
    public void onReceivedTitle(WebView view, String title) {
        super.onReceivedTitle(view, title);

        sharedPreferences = new Shared_Preferences( context );
        sharedPreferences.setPageWebView(view.getUrl());
    }

}
person Grafritz Design    schedule 26.02.2020
comment
Пожалуйста, используйте английский язык, так как это сайт только на английском языке. В этом случае нужно перевести только 3 строки. - person Scratte; 26.02.2020

Добавить клиент веб-просмотра

mWebView.setWebViewClient(new WebViewClient());
person SamiunNafis    schedule 05.04.2020

Вам нужно добавить клиент WebView

mWebView.setWebViewClient(new WebViewClient() {

   public void onPageFinished(WebView view, String url) {
        // do your stuff here
    }
});

также вы можете использовать onPageFinished для выполнения задачи после того, как веб-просмотр завершил загрузку веб-страницы.

person Mirza Ahmed Baig    schedule 11.06.2020

Activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <WebView
        android:id="@+id/webView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Основная активность.java:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {
    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }
    WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = findViewById(R.id.webView);
        webView .loadUrl("http://www.google.com");
        webView.setWebViewClient(new MyWebViewClient());
    }
}

AndroidManifest.xml: (добавьте разрешение на использование и android:usesCleartextTraffic)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:usesCleartextTraffic="true"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
person live-love    schedule 06.02.2021

Добавьте метод ниже в свой класс активности. Здесь браузер - это не что иное, как ваш объект веб-просмотра.

Теперь вы можете легко просматривать веб-страницы.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && browser.canGoBack()) {
        browser.goBack();
        return true;
    }
    return false;
}
person G . Anil Guptha    schedule 10.09.2012
comment
Это добавляет функциональность кнопке «Назад» в нижней части телефона Android: она работает как кнопка «Назад» в браузере. - person Don Larynx; 11.03.2015

person    schedule
comment
Я устанавливаю собственный webViewClient для своего веб-просмотра. В моем специально созданном WebViewClient я перегрузил метод shouldOverrideUrlLoading для загрузки моего URL-адреса. Я передаю свой URL-адрес с помощью этого адреса: webview.loadUrl(URL); - person Rahul; 28.08.2013
comment
Это плохой способ сделать это. shouldOverrideUrlLoading вызывается для всех страниц, загруженных в веб-просмотре. Это включает в себя iFrame, что означает, что если страница загружает iFrame, страница будет заменена iFrame. Это не рекомендуется на соответствующей странице документов Android. - person Hack5; 13.01.2018