Je suis nouveau dans le développement d'applications Android et je l'apprends.
J'ai développé une application qui charge un lien vers un site Web à l'aide de WebView
. Et ça fonctionne bien.
Mais je suis confronté à des problèmes pour afficher et masquer la barre de progression lorsque WebView
charge une page.
Je souhaite afficher une barre de progression (juste spinner au centre) lorsque WebView charge le lien principal et les liens internes d'un site Web et masque la barre de progression lorsque la page est complètement chargée.
Mon code 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);
}
}
Et mon code XML de mise en page:
<?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>
Pour le moment, la barre de progression est affichée, mais elle ne se cache pas.
Lorsque je crée un objet progressbar et que j'ajoute une ligne au-dessous de code Java, la barre de progression ne s'affiche pas.
progressbar.setVisibility(View.GONE);
J'ai également essayé une autre réponse mais la barre de progression ne fonctionne pas lorsque je clique sur des liens internes.
Je souhaite afficher la barre de progression lors du chargement de la page principale et masquer la barre de progression lorsque la page principale est complètement chargée.
Je souhaite afficher à nouveau la barre de progression lorsque l'utilisateur clique sur des liens internes du site Web et comme précédemment, masque la barre de progression lorsque la page est complètement chargée.
S'il vous plaît, aidez-moi, je suis débutant dans le développement d'applications Android.
essayez ce code ... vous avez besoin de webChoromeClient pour suivre la progression du chargement de la visualisation Web ...
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);
}
}
});
Remplacez votre client WebView par ce code ....
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
Solution garantie:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageCommitVisible(WebView view, String url) {
super.onPageCommitVisible(view, url);
mProgressBar.setVisibility(View.INVISIBLE);
}
});
Au cas où quelqu'un chercherait une Kotlin solution, cette solution simple a fonctionné pour moi:
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"
}
Salut les gars, j'ai utile cette méthode, cela vous aiderait sûrement aussi.
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);
}
});
J'ai ajouté la suite à mon code et cela a très bien fonctionné pour moi.
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);
}
}