WebView 내에서 외부 웹 페이지를로드하는 방법


120

내 문제는 웹 페이지가 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" />

안녕하세요 Gilbou 코드는 2.2에서 일하고
Dipak Keshariya

하지만 나와 함께하지 않습니다 :( HTC Wildfire에서도 에뮬레이터에서도 ... 이해가 안 돼요.
Gilbou

1
좋아 ... 이제 작동합니다. 그러나 웹보기 내부에 페이지를 표시하는 대신 웹 브라우저를 시작합니다.
Gilbou 2011 년

안녕하세요, UR이이 코드를 실행하면 브라우저가 열립니다.
Dipak Keshariya 2011 년

당신은 정말이 튜토리얼 링크를 필요 안드로이드 웹보기의 예
Athira 레디

답변:


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

    }

}

좋은 점이 있지만 웹에 페이지를 포함하고 싶습니다. 웹보기를 사용하여 가능합니까?
Zala Janaksinh

16
그나마 권한을 추가하는 것을 잊지 <사용-권한은 안드로이드 : 이름 = "android.permission.INTERNET은"/>
star18bit

2
실제로 webview 내부의 URL을 처리하려면 webviewclient를 설정해야합니다. 클라이언트를 설정하지 않은 경우 기본 동작은 URL을 처리하는 애플리케이션을 시작하는 것입니다. 이 링크를
erdemlal

2
자바 스크립트를 활성화하면 앱이 잠재적 인 보안 문제에 노출되며 코드에서 사용할 때 android sdk가 이에 대해 경고합니다. 웹보기에 표시 할 웹 사이트를 제어 할 수 있고 Java 스크립트를 활성화하는 것이 쉬운 솔루션으로 간주되지 않는 한이 작업을 수행하지 마십시오.
LostPuppy

1
보기 ..이 코드를 개방하지 않음Webpage not available
란 지트 쿠마르

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
죄송합니다. 매니페스트에서 무언가를 변경 한 것 같고 이제는 작동합니다. 그러나 여전히 페이지는 웹보기가 아닌 웹 브라우저에서로드됩니다.
Gilbou

이 줄은 나를 위해 일했습니다. webView.getSettings (). setJavaScriptEnabled (true);
pixparker 2014 년

1
mWebview.getSettings (). setJavaScriptEnabled (true); 나를 위해 일한, 우리는이 라인을 추가 할 필요가
니나

이것은 그것을하는 나쁜 방법입니다. shouldOverrideUrlLoadingwebview에로드 된 모든 페이지에 대해 호출됩니다. 여기에는 iFrame이 포함됩니다. 즉, 페이지가 iFrame을로드하면 페이지가 iFrame으로 대체됩니다. 관련 Android 문서 페이지에서는 권장하지 않습니다.
Hack5

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에서 내 URL을로드하기 위해 shouldOverrideUrlLoading 메서드를 오버로드했습니다. 이 위치에 내 URL을 전달하고 있습니다. webview.loadUrl ( "URL");
Rahul

이것은 그것을하는 나쁜 방법입니다. shouldOverrideUrlLoadingwebview에로드 된 모든 페이지에 대해 호출됩니다. 여기에는 iFrame이 포함됩니다. 즉, 페이지가 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
효과가있다. 하지만 두 가지를 놓쳤습니다. 첫째, 인터넷 권한이 필요하다는 것을 보여주지 않았고, 둘째, 배경 이미지를 사용했습니다. 감사
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 파일로 이동하여 webView에 ID를 부여한 다음 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

이 시도;

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

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.xmlApplication 근처에 추가해야

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

1

WebView 클라이언트 추가

mWebView.setWebViewClient(new WebViewClient());

0

WebView 클라이언트를 추가해야합니다.

mWebView.setWebViewClient(new WebViewClient() {

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

또한 onPageFinished를 사용하여 webview가 웹 페이지를로드 한 후 작업을 수행 할 수 있습니다.


-1

활동 클래스에 아래 메소드를 추가하십시오. 여기 브라우저는 웹뷰 객체 일뿐입니다.

이제 웹 포함 페이지를 쉽게 볼 수 있습니다.

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

이렇게하면 Android 휴대폰 하단의 "뒤로"버튼에 기능이 추가됩니다. "뒤로"브라우저 버튼으로 작동합니다.
Don Larynx 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.