Как получить загруженный заголовок веб-страницы в 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());
            }

        });

    }

person Sam    schedule 19.11.2011    source источник


Ответы (7)


Вам нужно будет использовать собственный 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: действие — setTitle()

Разработчики Android: WebViewClient

Разработчики Android: WebView

person DallaRosa    schedule 19.11.2011
comment
Конечно, нет проблем. Просто просмотрите ссылки на документацию, которые я разместил, и вы поймете, что можно делать с классом WebView и WebViewClient. Сначала это может показаться сложным, но это дает вам большую гибкость. - person DallaRosa; 19.11.2011
comment
я могу прочитать значение, но когда я устанавливаю значение, оно не отображается в заголовке приложения, я обновил вопрос с помощью реализации моего веб-представления. пожалуйста, помогите - person Sam; 19.11.2011
comment
Посмотрите на свой код. Вы устанавливаете пользовательский webviewclient и пользовательский webchromeclient после загрузки страницы. Вы должны переместить mWebView.loadUrl(url); строку в конец метода onCreate (или, по крайней мере, после установки webviewclient и webchromeclient), чтобы эти настройки работали - person DallaRosa; 19.11.2011

По моим наблюдениям, вы получаете заголовок веб-страницы, используя 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);
        }
    }
});
person Zeba    schedule 28.08.2012
comment
Похоже, что это не вызывается после вызова WebView.goBack(). Итак, если вам нужно обрабатывать обратную навигацию, я думаю, что onPageFinished() может быть лучшим выбором. - person Michael Levy; 21.04.2015
comment
См. code.google.com/p/android/issues/detail?id. =66337. Похоже, что поведение onReceivedTitle() было нарушено в некоторых сборках Android. - person Michael Levy; 24.04.2015

Самый простой способ прочитать заголовок страницы в Котлине:

      webView.webViewClient = object : WebViewClient() {
         //....
          override fun onPageFinished(view: WebView, url: String) {
           val title = view.title
            }
           //...
          }
person Hamed Jaliliani    schedule 26.01.2019

Итак, по моему опыту, вы должны использовать как onReceivedTitle, так и onPageFinished. Я обнаружил, что иногда onPageFinished вы не получите уведомление, если вы используете переднюю часть с помощью реактивного маршрутизатора или чего-то подобного. И у onReceivedTitle есть недостаток, как упомянул @michael-levy.

person Geng Jiawen    schedule 09.06.2017

Что делать, если вам не нужен весь заголовок, а только доменное имя. Например, если вы хотите показать только «Google» с www.google.com, и у вас есть все параметры запроса в этом заголовке.

    URL hostUrl= new URL(webView.getUrl());
    String title = hostUrl.getHost();
    title = title.startsWith("www.") ? title.substring(4) : title;
person Abhinav Saxena    schedule 23.08.2017

получить изображение и заголовок из веб-просмотра

Изображение

img.setImageBitmap(webview1.getFavicon());

Заголовок

txt.setText(webview1.getTitle());

person Nizar Jafar    schedule 23.08.2020

person    schedule
comment
этот тип может получить заголовок по запросу ajax - person Tamic; 07.07.2017