Ich bin neu in der Entwicklung von Android-Apps und lerne sie.
Ich habe eine Anwendung entwickelt, die einen Website-Link mit einer WebView
lädt. Und es funktioniert gut.
Ich habe jedoch Probleme beim Anzeigen und Ausblenden der Fortschrittsleiste, wenn die WebView
eine Seite lädt.
Ich möchte eine Fortschrittsleiste anzeigen (Nur Spinner in der Mitte), wenn der WebView den Hauptlink und die internen Links einer Website lädt, und die Fortschrittsleiste ausblenden, wenn die Seite vollständig geladen ist.
Mein Java-Code:
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);
}
}
Und mein Layout-XML-Code:
<?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>
Im Moment wird der Fortschrittsbalken angezeigt, aber nicht ausgeblendet.
Wenn ich ein progressbar -Objekt erstelle und im Java-Code unterhalb der Zeile hinzufüge, wird die Fortschrittsleiste nicht angezeigt.
progressbar.setVisibility(View.GONE);
Ich habe auch eine andere Antwort ausprobiert , aber die Fortschrittsanzeige funktioniert nicht, wenn ich auf interne Links klicke.
Ich möchte die Fortschrittsleiste anzeigen, wenn die Hauptseite geladen wird, und die Fortschrittsleiste ausblenden, wenn die Hauptseite vollständig geladen ist.
Ich möchte die Fortschrittsleiste erneut anzeigen, wenn der Benutzer auf interne Links der Website klickt. Die Fortschrittsleiste wird wie oben ausgeblendet, wenn die Seite vollständig geladen ist.
Bitte helfen Sie, ich bin Anfänger in der Entwicklung von Android-Apps.
probieren Sie diesen Code aus ... Sie benötigen den webChoromeClient, um den Ladevorgang der Webansicht zu verfolgen ...
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);
}
}
});
Ersetzen Sie Ihren Webview-Client durch diesen Code ....
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
Garantierte Lösung:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageCommitVisible(WebView view, String url) {
super.onPageCommitVisible(view, url);
mProgressBar.setVisibility(View.INVISIBLE);
}
});
Falls jemand nach einer Kotlin -Lösung sucht, hat diese einfache Lösung für mich funktioniert:
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"
}
Hey Leute, ich habe diese Methode nützlich, das würde dir sicherlich auch helfen.
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);
}
});
Ich habe folgendes zu meinem Code hinzugefügt und es hat sehr gut für mich funktioniert.
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);
}
}