web-dev-qa-db-ja.com

Android?

Androidアプリ開発とそれを学ぶことで新しいです。

WebViewを使用してWebサイトのリンクをロードするアプリケーションを開発しました。そして、それはうまく機能しています。

しかし、WebViewがページをロードするときに、プログレスバーを表示または非表示にする問題に直面しています。

WebViewがWebサイトのメインリンクと内部リンクをロードするときにプログレスバー(中央にあるスピナーのみ)を表示し、ページが完全にロードされるとプログレスバーを非表示にしたい。

私のJavaコード:

package in.matebook.myapplication;

import Android.app.Activity;
import Android.content.Intent;
import Android.net.Uri;
import Android.os.Bundle;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.webkit.WebSettings;
import Android.webkit.WebView;
import Android.webkit.WebViewClient;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WebView myWebView = (WebView) findViewById(R.id.webView);
        myWebView.setWebViewClient(new MyWebViewClient());
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        myWebView.loadUrl("http://www.labnol.org");
    }



    private class MyWebViewClient extends WebViewClient {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            if (Uri.parse(url).getHost().equals("www.labnol.org")) {
                // This is my web site, so do not override; let my WebView load the page
                //or we can add more allowed Host in if condition
                return false;
            }
            // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }


    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return false;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

そして私のレイアウト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"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".MainActivity">


    <WebView  xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/webView"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        />

    <ProgressBar
        Android:id="@+id/progressBar"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleLarge"
        Android:layout_centerVertical="true"
        Android:layout_centerHorizontal="true" />

</RelativeLayout>

現在、進行状況バーは表示されていますが、非表示にはなりません。

progressbarオブジェクトを作成し、Javaコードの行の下に追加すると、進行状況バーが表示されません。

progressbar.setVisibility(View.GONE);

別の答え も試しましたが、内部リンクをクリックしてもプログレスバーが機能しません。

  1. メインページが読み込まれたときにプログレスバーを表示し、メインページが完全に読み込まれたときにプログレスバーを非表示にしたい。

  2. ユーザーがWebサイトの内部リンクをクリックしたときにプログレスバーを再度表示し、上記と同様に、ページが完全に読み込まれたときにプログレスバーを非表示にします。

助けてください、私はAndroidアプリ開発の初心者です。

10
Rinku

このコードを試してください... webviewの読み込みの進行状況を追跡するには、webChoromeClientが必要です...

webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
    progressBar.setProgress(progress);
    if (progress == 100) {
        progressBar.setVisibility(View.GONE);

    } else {
        progressBar.setVisibility(View.VISIBLE);

    }
 }
});

WebViewクライアントをこのコードに置き換えます...

private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);
    return true;
   }
}
29
Rishad Appat

保証されたソリューション:

        webView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageCommitVisible(WebView view, String url) {
            super.onPageCommitVisible(view, url);
            mProgressBar.setVisibility(View.INVISIBLE);
        }
    });
3
Ronit Mankad

誰かがKotlin解決策を探している場合、この単純な解決策が私にとってうまくいきました:

private fun setupWebView() {

    val webViewClient: WebViewClient = object: WebViewClient() {

        override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
            view?.loadUrl(request?.url.toString())
            return super.shouldOverrideUrlLoading(view, request)
        }

        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
            showProgressDialog()
            super.onPageStarted(view, url, favicon)
        }

        override fun onPageFinished(view: WebView?, url: String?) {
            hideProgressDialog()
            super.onPageFinished(view, url)
        }
    }
    webView.webViewClient = webViewClient

    webView.settings.javaScriptEnabled = true
    webView.settings.defaultTextEncodingName = "utf-8"
}
2

こんにちは、私はこの方法を便利に使っています。それもきっとあなたを助けるでしょう。

XML

<WebView
        Android:id="@+id/webid"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"/>

<ProgressBar
    Android:id="@+id/progress_bar"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerHorizontal="true"
    Android:layout_centerVertical="true" />

Java:

WebView webView = (WebView)findViewById(R.id.webid);
WebSettings websettings = webView.getSettings();

webSettings.setJavaScriptEnabled(true);
webSettings.setGeolocationEnabled(true);
webSettings.setSupportMultipleWindows(true);


webView.setWebViewClient(new WebViewClient(){

    public void onPageFinished(WebView view,String url){
       ProgressBar progressbar = (ProgressBar) findViewById(R.id.progress_bar);
       progressbar.setVisibility(View.GONE);
       }
});
0
Mac Dilshad

以下をコードに追加しましたが、それは私にとって非常にうまくいきました。

XML:

   <WebView
    Android:id="@+id/updates_webview"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"  />

   <ProgressBar
    Android:id="@+id/progressBar"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    style="?android:attr/progressBarStyleLarge"
    Android:layout_centerVertical="true"
    Android:layout_centerHorizontal="true" />

Java:

public class HelloWebViewClient extends WebViewClient {
    @Override
    public void onPageFinished(WebView view, String url) {
        // TODO Auto-generated method stub
        super.onPageFinished(view, url);
        ProgressBar progressBar =  findViewById(R.id.progressBar1);
        progressBar.setVisibility(View.GONE);
    }
}
0
Harshil Shah