Как получить загруженный заголовок веб-страницы в Android WebView? - PullRequest
42 голосов
/ 19 ноября 2011

Я использую 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());
            }

        });

    }

Ответы [ 6 ]

86 голосов
/ 19 ноября 2011

Вы должны будете использовать пользовательский 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

44 голосов
/ 28 августа 2012

По моим наблюдениям, вы получаете заголовок веб-страницы, используя 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);
        }
    }
});
1 голос
/ 06 июля 2017
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);
        }
    }
0 голосов
/ 26 января 2019

Простейший способ прочитать заголовок страницы в Kotlin:

      webView.webViewClient = object : WebViewClient() {
         //....
          override fun onPageFinished(view: WebView, url: String) {
           val title = view.title
            }
           //...
          }
0 голосов
/ 23 августа 2017

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

    URL hostUrl= new URL(webView.getUrl());
    String title = hostUrl.getHost();
    title = title.startsWith("www.") ? title.substring(4) : title;
0 голосов
/ 09 июня 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...