web-dev-qa-db-fra.com

Comment obtenir le titre de la page Web chargé dans Android WebView?

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());
            }

        });

    }
39
Sam

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 ()

Développeurs Android: WebViewClient

Développeurs Android: WebView

81
DallaRosa

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);
        }
    }
});
41
Zeba
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);
        }
    }
1
Tamic

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;
0
Abhinav Saxena

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
            }
           //...
          }
0
Hamed Jaliliani

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.

0
Geng Jiawen