Cách tải trang web bên ngoài bên trong WebView


120

Vấn đề của tôi là trang web không được tải bên trong chế độ xem web.

mWebview.loadUrl("http://www.google.com"); khởi chạy trình duyệt web ...

Đây là mã hoạt động của tôi:

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);
    }   
}

Tôi đã thêm quyền cần thiết trong Tệp kê khai:

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

Xin chào Gilbou Mã của bạn là làm việc trong 2,2
Dipak Keshariya

Nhưng không phải với tôi :( Không trên HTC Wildfire, cũng không trên Trình giả lập ... Tôi chỉ không hiểu.
Gilbou

1
Ok ... bây giờ nó hoạt động. Nhưng nó khởi chạy trình duyệt web thay vì hiển thị trang bên trong chế độ xem web.
Gilbou

Xin chào, điều này có nghĩa là Nếu UR Chạy mã này thì Trình duyệt đang mở.
Dipak Keshariya

Bạn thực sự cần liên kết hướng dẫn này ví dụ
webview

Câu trả lời:


224

Nhờ bài đăng này , cuối cùng tôi đã tìm ra giải pháp. Đây là mã:

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 );

    }

}

Thật tuyệt nhưng tôi muốn Hiển thị trang web chứa trang khôn ngoan. Có thể sử dụng webview không?
Zala Janaksinh

16
Đừng quên thêm Quyền <
use

2
Trên thực tế, để xử lý với url bên trong chế độ xem web của bạn, bạn nên đặt một webviewclient, nếu bạn không đặt máy khách, hành vi mặc định là khởi chạy ứng dụng xử lý URL. Xem liên kết này
erdemlal

2
Việc kích hoạt tập lệnh java sẽ mở ứng dụng của bạn đến các vấn đề bảo mật tiềm ẩn và tôi chắc chắn android sdk cảnh báo bạn chống lại nó khi bạn sử dụng nó trong mã. Đừng làm điều này trừ khi bạn có thể kiểm soát trang web nào bạn hiển thị trong chế độ xem web của mình và kích hoạt tập lệnh java không được coi là một giải pháp dễ dàng.
LostPuppy

1
Không mở mã này .. ĐangWebpage not available
Ranjith Kumar

44

thử cái này

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"
/>

Trong Hoạt động của bạn:

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

Cập nhật

Thêm webView.setWebViewClient(new WebViewController());vào Hoạt động của bạn.

Lớp WebViewController:

public class WebViewController extends WebViewClient {

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

1
lấy làm tiếc. Có vẻ như tôi đã thay đổi một cái gì đó trong tệp kê khai và bây giờ nó cũng hoạt động. nhưng trang vẫn được tải trong trình duyệt web, không phải trong chế độ xem web.
Gilbou

dòng này phù hợp với tôi: webView.getSettings (). setJavaScriptEnabled (true);
pixparker

1
mWebview.getSettings (). setJavaScriptEnabled (true); đã làm việc cho tôi, chúng tôi phải thêm dòng này
neena

Đây là một cách làm không tốt. shouldOverrideUrlLoadingđược gọi cho tất cả các trang được tải trong chế độ xem web. Điều này bao gồm iFrame, có nghĩa là nếu trang tải một iFrame, trang đó sẽ được thay thế bằng iFrame. Điều này không được khuyến khích trên trang tài liệu android có liên quan.
Hack 5

19
public class WebViewController extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}
webView.setWebViewClient(new WebViewController());

1
Tôi đang đặt một webViewClient tùy chỉnh cho chế độ xem web của mình. Trong WebViewClient được tạo tùy chỉnh của tôi, tôi đã nạp chồng phương thức shouldOverrideUrlLoading để tải url của mình. Tôi đang chuyển url của mình với loc này: webview.loadUrl ("URL");
Rahul

Đây là một cách làm không tốt. shouldOverrideUrlLoadingđược gọi cho tất cả các trang được tải trong chế độ xem web. Điều này bao gồm iFrame, có nghĩa là nếu trang tải một iFrame, trang đó sẽ được thay thế bằng iFrame. Điều này không được khuyến khích trên trang tài liệu android có liên quan.
Hack 5

13

Vui lòng sử dụng mã này: -

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();
    }
}

Hãy thử mã này nếu có bất kỳ câu hỏi nào hỏi tôi.


1
nó hoạt động. Nhưng bạn đã bỏ lỡ 2 điều. Đầu tiên, bạn đã không cho thấy sự cho phép internet là cần thiết, Thứ hai, sử dụng hình nền. cảm ơn
Sumon Bappi

7

Rất đơn giản, hãy thử tích hợp những dòng mã này, trước tiên hãy nhận quyền trong tệp Android Manifest

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

sau đó viết một số mã trong Activity.xml của bạn

<?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>

Sau đó, viết mã này trong MainActivity.java của bạn

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");

}

}

Hãy thử điều này, nó sẽ giúp bạn giải quyết vấn đề của mình


4

chỉ cần vào tệp XML và cung cấp id cho webView của bạn sau đó trong java dán dòng sau:

   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");
    }   
}

1

Bạn có thể làm như thế này.

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

1

thử cái này;

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

1

Thêm quyền Internet trong AndroidManifest.xml

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

Trong Bố cục của bạn:

<?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"
 />

Trong Hoạt động của bạn

@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());
    }

}

1
Vui lòng sử dụng tiếng Anh, vì đây là trang web chỉ có tiếng Anh. Trong trường hợp này, chỉ có 3 dòng cần dịch.
Scratte

1

Tôi đã sử dụng mã này thật tuyệt. nhưng có một lỗi. "neterr_cleartext_not_periled" hiển thị khi bạn sử dụng mã này thì bạn sẽ gặp phải vấn đề này ..

Tôi có một giải pháp cho vấn đề này. Bạn phải thêm nó vào AndroidManifest.xml của bạn gần về Ứng dụng

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

1

Thêm ứng dụng khách WebView

mWebView.setWebViewClient(new WebViewClient());

0

Bạn cần thêm ứng dụng WebView

mWebView.setWebViewClient(new WebViewClient() {

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

Ngoài ra, bạn có thể sử dụng onPageFinishing để thực hiện tác vụ sau khi webview tải xong trang web


-1

Thêm phương thức dưới đây trong lớp hoạt động của bạn. Trình duyệt Here không là gì khác ngoài đối tượng webview của bạn.

Bây giờ bạn có thể xem trang web chứa trang một cách dễ dàng.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && browser.canGoBack()) {
        browser.goBack();
        return true;
    }
    return false;
}

Điều này bổ sung một chức năng cho nút "quay lại" ở cuối điện thoại Android: Nó hoạt động như một nút trình duyệt "quay lại".
Don Larynx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.