web-dev-qa-db-de.com

Wie bekomme ich den geladenen Titel der Webseite in Android WebView?

Ich verwende eine WebView in meiner Anwendung. Ich habe die Anforderung, den App-Titel basierend auf dem aktivierten Seitenbenutzer zu ändern. Wie mache ich das in Android WebView?

Ich habe dies in iphone durch folgende Zeile getan

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

Sie müssen einen benutzerdefinierten WebViewClient verwenden, um dies auszuführen. Sie überschreiben die onPageFinished () -Methode. Wenn eine neue Seite geladen ist, können Sie die Webansicht auf den entsprechenden Titel setzen.

Nachfolgend finden Sie eine Beispielimplementierung der obigen Ausführungen:

    WebView mWebView = (WebView) findViewById(R.id.mwebview);
    mWebView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            ExperimentingActivity.this.setTitle(view.getTitle());
        }
    });

Sie werden dies tun, wenn Sie Ihre Webansicht initialisieren. Ersetzen Sie die "ExperimentingActivity" durch den Namen Ihrer Aktivität.

Wenn Sie den WebViewClient bereits überschreiben, fügen Sie einfach diese Funktion oder den Code zu Ihrer bereits vorhandenen Funktion hinzu.

Weitere Informationen zu den Klassen und Funktionen, die ich hier verwende, erhalten Sie hier:

Android-Entwickler: Aktivität - setTitle ()

Android-Entwickler: WebViewClient

Android-Entwickler: WebView

81
DallaRosa

Meine Beobachtung ist, dass Sie den Websitetitel mit WebChromeClient in kürzerer Zeit als mit WebViewClient erhalten.

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

Was ist, wenn Sie nicht den ganzen Titel und nur einen Domain-Namen haben möchten, wie wenn Sie nur "Google" von www.google.com anzeigen möchten und alle Abfrageparameter in diesem Titel vorhanden sind.

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

Einfachste Möglichkeit, den Seitentitel in Kotlin zu lesen:

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

Meine Erfahrung sollten Sie also onReceivedTitle und onPageFinished verwenden. Ich finde, dass onPageFinished manchmal nicht benachrichtigt wird, wenn das Frontend mit Reakt-Router oder etwas Ähnlichem verwendet wird. Und onReceivedTitle hat einen Fehler wie @ michael-levy erwähnt.

0
Geng Jiawen