วิธีโหลดหน้าเว็บภายนอกภายใน WebView


120

ปัญหาของฉันคือไม่ได้โหลดหน้าเว็บในมุมมองเว็บ

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

ฉันได้เพิ่มการอนุญาตที่จำเป็นในไฟล์ Manifest:

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

สวัสดี Gilbou your Code ทำงานใน 2.2
Dipak Keshariya

แต่ไม่ใช่กับฉัน :( ทั้งบน HTC Wildfire ไม่ได้อยู่ใน Emulator ... ฉันไม่เข้าใจ
Gilbou

1
โอเค ... ตอนนี้ใช้งานได้แล้ว แต่จะเปิดเว็บเบราว์เซอร์แทนที่จะแสดงหน้าเว็บในมุมมองเว็บ
Gilbou

สวัสดีนี่หมายความว่าถ้า UR เรียกใช้รหัสนี้เบราว์เซอร์จะเปิดอยู่
Dipak Keshariya

คุณต้องการลิงก์การสอนนี้จริงๆตัวอย่าง
เว็บวิวของ

คำตอบ:


224

ขอบคุณโพสต์นี้ในที่สุดฉันก็พบวิธีแก้ปัญหา นี่คือรหัส:

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

    }

}

สิ่งที่ดี แต่ฉันต้องการแสดงเว็บที่มีหน้าอย่างชาญฉลาดเป็นไปได้โดยใช้ webview หรือไม่?
Zala Janaksinh

16
อย่าลืมเพิ่มสิทธิ์ <ใช้ - อนุญาต android: name = "android.permission.INTERNET" />
star18bit

2
ที่จริงแล้วในการจัดการกับ url ภายใน webview ของคุณคุณควรตั้งค่า webviewclient หากคุณไม่ได้ตั้งค่าไคลเอนต์พฤติกรรมเริ่มต้นคือการเปิดแอปพลิเคชันที่จัดการ URL ดูลิงค์นี้
erdemlal

2
การเปิดใช้งานสคริปต์ java จะทำให้แอปของคุณมีปัญหาด้านความปลอดภัยที่อาจเกิดขึ้นและฉันแน่ใจว่า android sdk เตือนคุณเมื่อคุณใช้ในรหัส อย่าทำเช่นนี้เว้นแต่คุณจะสามารถควบคุมเว็บไซต์ที่คุณแสดงใน webview ของคุณและไม่ควรมองว่าการเปิดใช้งานสคริปต์ java เป็นวิธีแก้ปัญหาที่ง่าย
LostPuppy

1
ไม่ได้เปิดรหัสนี้ .. กำลังแสดงWebpage not available
Ranjith Kumar

44

ลองดู

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

1
ขอโทษ ดูเหมือนว่าฉันจะเปลี่ยนบางอย่างในไฟล์ Manifest และตอนนี้ก็ใช้ได้เช่นกัน แต่ถึงกระนั้นหน้าดังกล่าวยังโหลดในเว็บเบราว์เซอร์ไม่ใช่ในมุมมองเว็บ
Gilbou

บรรทัดนี้ใช้ได้กับฉัน: webView.getSettings (). setJavaScriptEnabled (true);
pixparker

1
mWebview.getSettings () setJavaScriptEnabled (จริง). ทำงานให้ฉันเราต้องเพิ่มบรรทัดนี้
neena

นี่เป็นวิธีที่ไม่ดีในการทำ shouldOverrideUrlLoadingถูกเรียกสำหรับทุกหน้าที่โหลดใน webview ซึ่งรวมถึง iFrames ซึ่งหมายความว่าหากหน้าเว็บโหลด iFrame หน้านั้นจะถูกแทนที่ด้วย iFrame สิ่งนี้ไม่สนับสนุนในหน้าเอกสาร Android ที่เกี่ยวข้อง
แฮ็ค 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
ฉันกำลังตั้งค่า webViewClient ที่กำหนดเองให้กับ webview ของฉัน ใน WebViewClient ที่กำหนดเองของฉันฉันได้โหลดเมธอด shouldOverrideUrlLoading มากเกินไปเพื่อโหลด url ของฉัน ฉันกำลังส่ง url ของฉันด้วย loc: webview.loadUrl ("URL");
Rahul

นี่เป็นวิธีที่ไม่ดีในการทำ shouldOverrideUrlLoadingถูกเรียกสำหรับทุกหน้าที่โหลดใน webview ซึ่งรวมถึง iFrames ซึ่งหมายความว่าหากหน้าเว็บโหลด iFrame หน้านั้นจะถูกแทนที่ด้วย iFrame สิ่งนี้ไม่สนับสนุนในหน้าเอกสาร Android ที่เกี่ยวข้อง
Hack5

13

กรุณาใช้รหัสนี้: -

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

ลองใช้รหัสนี้หากมีข้อสงสัยถามฉัน


1
มันได้ผล. แต่คุณพลาด 2 อย่าง ประการแรกคุณไม่ได้แสดงการอนุญาตอินเทอร์เน็ตเป็นสิ่งจำเป็นประการที่สองการใช้ภาพพื้นหลัง ขอบคุณ
Sumon Bappi

7

ง่ายมากลองรวมบรรทัดของโค้ดเหล่านี้ก่อนโดยได้รับอนุญาตในไฟล์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");

}

}

ลองใช้วิธีนี้จะช่วยคุณแก้ปัญหาได้


4

เพียงเข้าไปในไฟล์ XML และให้ id แก่ 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");
    }   
}

1

คุณสามารถทำเช่นนี้

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


1

เพิ่มสิทธิ์อินเทอร์เน็ตใน 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());
    }

}

1
กรุณาใช้ภาษาอังกฤษเนื่องจากเว็บไซต์นี้เป็นภาษาอังกฤษเท่านั้น ในกรณีนี้มีเพียง 3 บรรทัดเท่านั้นที่ต้องแปล
Scratte

1

ฉันใช้รหัสนี้ที่เจ๋ง แต่มีข้อผิดพลาด "neterr_cleartext_not_permitted" แสดงเมื่อคุณใช้รหัสนี้แล้วคุณจะประสบปัญหานี้ ..

ฉันมีวิธีแก้ปัญหานี้คุณต้องเพิ่มสิ่งนี้ในAndroidManifest.xmlของคุณใกล้กับแอปพลิเคชัน

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


0

คุณต้องเพิ่มไคลเอนต์ WebView

mWebView.setWebViewClient(new WebViewClient() {

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

นอกจากนี้คุณยังสามารถใช้ onPageFinished เพื่อทำงานหลังจากที่ Webview โหลดหน้าเว็บเสร็จแล้ว


-1

เพิ่มวิธีการด้านล่างในคลาสกิจกรรมของคุณเบราว์เซอร์ที่นี่คืออะไรนอกจากอ็อบเจ็กต์ webview ของคุณ

ตอนนี้คุณสามารถดูเว็บที่มีเพจได้อย่างง่ายดาย

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

สิ่งนี้จะเพิ่มฟังก์ชันให้กับปุ่ม "ย้อนกลับ" ที่ด้านล่างของโทรศัพท์ Android: ทำงานเป็นปุ่มเบราว์เซอร์ "ย้อนกลับ"
Don Larynx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.