J'utilise une WebView dans mon application, je dois donc modifier le titre de l'application en fonction de la page sur laquelle l'utilisateur se trouve. Comment puis-je faire cela dans Android WebView?
Je l'ai fait dans l'iphone en suivant la ligne
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());
}
});
}
Pour ce faire, vous devrez utiliser un WebViewClient personnalisé . Vous substituerez la méthode onPageFinished () afin que, lorsqu'une nouvelle page se charge, vous pouvez définir la vue Web sur le titre approprié.
Voici un exemple de mise en œuvre de ce qui précède:
WebView mWebView = (WebView) findViewById(R.id.mwebview);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
ExperimentingActivity.this.setTitle(view.getTitle());
}
});
Vous allez faire cela en initialisant votre vue Web . Remplacez "ExperimentingActivity" par le nom de votre activité.
Si vous remplacez déjà WebViewClient, ajoutez simplement cette fonction ou le code qu'il contient à votre fonction existante.
Vous pouvez obtenir plus d'informations sur les classes et les fonctions que j'utilise ici:
Développeurs Android: Activité - setTitle ()
Mon observation est que vous obtenez le titre de la page Web en utilisant WebChromeClient
en moins de temps qu'en utilisant WebViewClient
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);
}
}
Que faire si vous ne voulez pas tout le titre et juste un nom de domaine, comme si vous ne vouliez afficher que "Google" sur www.google.com et que tous les paramètres de la requête figurent dans ce titre.
URL hostUrl= new URL(webView.getUrl());
String title = hostUrl.getHost();
title = title.startsWith("www.") ? title.substring(4) : title;
Le moyen le plus simple de lire le titre de la page dans Kotlin:
webView.webViewClient = object : WebViewClient() {
//....
override fun onPageFinished(view: WebView, url: String) {
val title = view.title
}
//...
}
Donc, mon expérience vous devriez utiliser onReceivedTitle et onPageFinished à la fois. Je trouve que parfois, sur onPageFinished, vous ne serez pas averti si vous utilisez frontal avec react-router ou un logiciel similaire. Et onReceivedTitle a le défaut mentionné par @ michael-levy.