Ich verwende eine WebView in meiner Anwendung. Ich habe die Anforderung, den App-Titel basierend auf dem aktivierten Seitenbenutzer zu ändern. Wie mache ich das in Android WebView?
Ich habe dies in iphone durch folgende Zeile getan
self.title = [webPage stringByEvaluatingJavaScriptFromString:@"document.title"]
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Adds Progrss bar Support
this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.webview );
// Makes Progress bar Visible
getWindow().setFeatureInt( Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
mWebView = (WebView) findViewById( R.id.webview ); //This is the id you gave
//to the WebView in the main.xml
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setSupportZoom(true); //Zoom Control on web (You don't need this
//if ROM supports Multi-Touch
mWebView.getSettings().setBuiltInZoomControls(true); //Enable Multitouch if supported by ROM
// Load URL
Bundle b = getIntent().getExtras();
String url = b.getString("url");
Log.d(TAG, "url " + url);
mWebView.loadUrl(url);
// Sets the Chrome Client, and defines the onProgressChanged
// This makes the Progress bar be updated.
mWebView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress){
//Make the bar disappear after URL is loaded, and changes string to Loading...
myActivity.setTitle("Loading...");
myActivity.setProgress(progress * 100); //Make the bar disappear after URL is loaded
// Return the app name after finish loading
if(progress == 100)
myActivity.setTitle(R.string.app_name);
}
});
mWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
// return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onLoadResource(WebView view, String url) {
// TODO Auto-generated method stub
super.onLoadResource(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
ImageView logoImageView = (ImageView)findViewById(R.id.logoimage);
logoImageView.setVisibility(View.GONE);
Log.d(TAG, "view.getTitle() " + view.getTitle());
myActivity.setTitle(view.getTitle());
}
});
}
Sie müssen einen benutzerdefinierten WebViewClient verwenden, um dies auszuführen. Sie überschreiben die onPageFinished () -Methode. Wenn eine neue Seite geladen ist, können Sie die Webansicht auf den entsprechenden Titel setzen.
Nachfolgend finden Sie eine Beispielimplementierung der obigen Ausführungen:
WebView mWebView = (WebView) findViewById(R.id.mwebview);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
ExperimentingActivity.this.setTitle(view.getTitle());
}
});
Sie werden dies tun, wenn Sie Ihre Webansicht initialisieren. Ersetzen Sie die "ExperimentingActivity" durch den Namen Ihrer Aktivität.
Wenn Sie den WebViewClient bereits überschreiben, fügen Sie einfach diese Funktion oder den Code zu Ihrer bereits vorhandenen Funktion hinzu.
Weitere Informationen zu den Klassen und Funktionen, die ich hier verwende, erhalten Sie hier:
Android-Entwickler: Aktivität - setTitle ()
Meine Beobachtung ist, dass Sie den Websitetitel mit WebChromeClient
in kürzerer Zeit als mit WebViewClient
erhalten.
webview.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
if (!TextUtils.isEmpty(title)) {
YourActivity.this.setTitle(title);
}
}
});
private WebViewClient mWvClient = new WebViewClient() {
@Override
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
String title = view.getTitle();//getTitle
super.doUpdateVisitedHistory(view, url, isReload);
}
}
Was ist, wenn Sie nicht den ganzen Titel und nur einen Domain-Namen haben möchten, wie wenn Sie nur "Google" von www.google.com anzeigen möchten und alle Abfrageparameter in diesem Titel vorhanden sind.
URL hostUrl= new URL(webView.getUrl());
String title = hostUrl.getHost();
title = title.startsWith("www.") ? title.substring(4) : title;
Einfachste Möglichkeit, den Seitentitel in Kotlin zu lesen:
webView.webViewClient = object : WebViewClient() {
//....
override fun onPageFinished(view: WebView, url: String) {
val title = view.title
}
//...
}
Meine Erfahrung sollten Sie also onReceivedTitle und onPageFinished verwenden. Ich finde, dass onPageFinished manchmal nicht benachrichtigt wird, wenn das Frontend mit Reakt-Router oder etwas Ähnlichem verwendet wird. Und onReceivedTitle hat einen Fehler wie @ michael-levy erwähnt.