Как загрузить заголовок веб-страницы в Android WebView?
Я использую WebView в своем приложении, у меня есть требование изменить название приложения на основе пользователя страницы. Как это сделать в Android WebView?
Я сделал это в iphone по следующей строке
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());
}
});
}
Ответы
Ответ 1
Для этого вам нужно будет использовать собственный WebViewClient.
Вы переопределите метод onPageFinished(), чтобы при завершении загрузки новой страницы вы могли настроить веб-просмотр на соответствующий заголовок.
Ниже приведен пример реализации вышеперечисленного:
WebView mWebView = (WebView) findViewById(R.id.mwebview);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
ExperimentingActivity.this.setTitle(view.getTitle());
}
});
Вы собираетесь сделать это, когда вы инициализируете свой веб-просмотр.
Замените "ExperimentingActivity" на любое имя вашей деятельности.
Если вы уже переопределяете WebViewClient, просто добавьте эту функцию или код внутри вашей уже существующей функции.
Вы можете получить дополнительную информацию о классах и функциях, которые я использую здесь:
Разработчики Android: Activity - setTitle()
Разработчики Android: WebViewClient
Разработчики Android: WebView
Ответ 2
Мое наблюдение заключается в том, что вы получаете заголовок веб-страницы, используя WebChromeClient
в меньшее время, чем используя 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);
}
}
});
Ответ 3
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);
}
}
Ответ 4
Итак, мой опыт, который вы должны использовать onReceivedTitle и onPageFinished, оба. Я нахожу, что иногда onPageFinished вы не будете получать уведомления, если вы используете интерфейс-маршрутизатор или что-то подобное. И onReceivedTitle имеет недостаток, о котором упоминалось в @michael-levy.
Ответ 5
Что делать, если вам не нужен весь заголовок и просто доменное имя, например, если вы хотите показывать только "Google" на www.google.com, и у вас есть все параметры запроса в этом заголовке.
URL hostUrl= new URL(webView.getUrl());
String title = hostUrl.getHost();
title = title.startsWith("www.") ? title.substring(4) : title;
Ответ 6
Простейший способ прочитать заголовок страницы в Котлине:
webView.webViewClient = object : WebViewClient() {
//....
override fun onPageFinished(view: WebView, url: String) {
val title = view.title
}
//...
}