Come ridurre dynamicmente la dimensione WebView in base al suo contenuto?

Una spiegazione dettagliata del problema può essere compresa da questa domanda poichè l'utente ha aggiunto l'image per spiegarlo meglio.

Sto caricando contenuti HTML nel mio WebView. Il mio layout ha molte visualizzazioni e WebView è collocato all'interno di ScrollView (secondo il requisito del layout). Per favore non rispondere come – "Don't put WebView inside ScrollView" . So che non è una buona cosa per mettere WebView all'interno di uno ScrollView, ma secondo il requisito ho bisogno di farlo.

  • Il progetto della libreria Android utilizza dichiarazioni-styleable - come compilare?
  • Come aggiungere API Apache HTTP (legacy) come dipendenza compilazione da build.grade per Android M?
  • Perché sto ancora ottenendo java.lang.NoClassDefFoundError: android.support.v7.appcompat.R $ attr?
  • Sviluppare un Home Screen Android
  • aggiornare il marcatore di Google Maps da un ricevitore SMS sms
  • In Android come registrati per ricevere trasmissioni plug-in per cuffie?
  • Quindi, ho frammento di sinistra (mostrando elementi di elenco) e frammento destro (mostrando i dati riflessi sulla selezione dell'elemento di elenco dall'estratto sinistro). Ora, prima di tutto quando carichi il contenuto HTML contenuto all'interno di WebV, mi sembra corretto. Successivamente, quando aggiorniamo WebView con nuovi contenuti HTML, si verifica il problema.

    Supponiamo che il mio primo contenuto Html sia di 100 linee che mostra correttamente e poi ricarico WebView con il mio nuovo contenuto Html che è di 40 righe, quindi il WebView non si restringe e si adatta al contenuto con 40 righe, rimane comunque fino a 100 linee che mostrano lo spazio bianco / vuoto in basso.

    Pertanto, sembra che WebView è in grado di ridimensionarsi da less contenuti precedentemente caricati in più contenuti ma non in grado di ridimensionarsi quando il contenuto è inferiore a quello contenuto in precedenza.

    Avevo provato molti modi,

    • Aggiunta di android:hardwareAccelerated="true" in Manifest
    • Questo blog
    • Anche molti altri modi e blog
    • Inoltre ho cercato di usare mWebView.clearView(); che causa di ridimensionare la dimensione di WebView ma a volte il WebView inizia a lampeggiare che è semplicemente fastidioso. Simile a questo video

    Ma, non riusciva a trovare alcuna soluzione corretta. Se qualcuno di voi ha lo stesso problema prima di farmi sapere la soluzione migliore che potrei applicare.

    AGGIORNARE –

    Dopo ulteriori googling sembra che questo sia un problema noto in Honeycomb. Questa domanda indica anche il problema simile.

  • Modifica dei metadati manifestati dal codice
  • WebView ricaricabile quando il frammento in ViewPager viene mantenuto da BackStack
  • Come mettere un'image in un AlertDialog? android
  • Come faccio a cambiamenti globali in tutta la mia applicazione in Android?
  • Nativescript accede all'accesso localhost in android e ios
  • Come riprendere l'attività Android in modo programmato dal background
  • 9 Solutions collect form web for “Come ridurre dynamicmente la dimensione WebView in base al suo contenuto?”

    Sembra che non sia ansible ridimensionare dynamicmente il WebView (diminuire) la sua dimensione quando viene caricato. Quindi, l'unica cosa che potrebbe risolvere il mio problema è stata la ricarica del WebView completo. Così, invece di definire il frammento in xml ho cambiato la mia roba aggiungendo frammento dynamicmente each volta. Per cui ho potuto risolvere il mio problema.

    Spero che questo aiuterà gli altri in futuro!

    Questo è un problema noto con WebView e alcune soluzioni disponibili non funzionano in tutti i dispositivi.

    Ho provato molte soluzioni fornite nelle risposte SO e ho cercato anche su internet, ma nessuno di loro ha funzionato anche per me.

    Ho finito, rimuovendo il WebView e l'aggiunta di WebView nella stessa posizione in Layout

    Ecco il codice demo,

      final RelativeLayout rl = new RelativeLayout(this); myWebView = new WebView(this); myWebView.setBackgroundColor(Color.GRAY); myWebView.loadUrl("file:///android_asset/1.htm"); rl.addView(myWebView); // ******* Added At Index 0 Button btn = new Button(this); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (!flg) { rl.removeViewAt(0); myWebView = new WebView(MainActivity.this); myWebView.setBackgroundColor(Color.GRAY); myWebView.loadUrl("file:///android_asset/3.htm"); rl.addView(myWebView, 0, new RelativeLayout.LayoutParams( new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT))); flg = true; } else { rl.removeViewAt(0); myWebView = new WebView(MainActivity.this); myWebView.setBackgroundColor(Color.GRAY); myWebView.loadUrl("file:///android_asset/1.htm"); rl.addView(myWebView, 0, new RelativeLayout.LayoutParams( new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT))); flg = false; } } }); rl.addView(btn); // ******* Added At Index 1 setContentView(rl); 

    ragazzi, sembra che ho trovato una soluzione per i contenuti locali. Basta call webView.reload () prima di caricare nuovi contenuti – in qualche modo fa ridimensionare senza lampeggiare.

    Questo fa la magia! Dice

    Proprietà Android: android: layout_weight = "1 nel layout dovrebbe funzionare …

    Nel mio caso, WebView è in RelativeLayout. Così facendo thi android: layout_height = "wrap_content" ha funzionato come un fascino 🙂

    non ho ancora provato, ma perché non provate ad impostare nuovamente i parametri di weblayout, prima di caricare i nuovi contenuti. cioè impostare l'altezza e la width al wrapcontent. se il successo trovato si prega di rispondere. se non troverebbe successo, andare meglio per javascipt

    Ho impostato la visibilità del mio WebView su Gone e caricato il contenuto nel WebView mentre è passato. Poi ho impostato la visibilità visibile dopo aver lasciato carico DOM e JS e sembra tracciare la lunghezza correttamente. Dal momento che non c'è un callback come onPageFinished per determinare quando il JS ha finito di eseguire, devo dare il WebView un ritardo di un secondo prima di impostare la visibilità su true. Questa soluzione è sufficiente per i miei scopi, quindi speriamo che risponda alle esigenze di alcuni di voi!

    Ogni volta che crei un object di webview e dà il suo parametro è un dolore invece puoi fare i seguenti passi e functionrà

    • metti un file html vuoto nella cartella degli assets e le dà un nome empty.html

    • call webview.loadUrl("file:///android_asset/empty.html");

    • carica ora il tuo contenuto.

    La visualizzazione Web verrà ridotta della sua altezza.

    Assicurati di non mettere alcun contenuto in empty.html

    Qui ho cambiato l'altezza del webview a seconda del softkeyboard display

      activityRootView = (RelativeLayout) findViewById(R.id.webview1); mWebView = (WebViewEx) WebViewActivity.this.findViewById(R.id.webview); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { public void onGlobalLayout() { Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. activityRootView.getWindowVisibleDisplayFrame(r); int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); if(heightDiff != lastValue) { if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard... Log.i("Screen Size Changed","KeyBoard Displaying"+ r.bottom); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); params.height=r.bottom; mWebView.setLayoutParams(params); //appView.sendJavascript("onKeyBoardShow(" + r.bottom + ");"); } else { /// appView.sendJavascript("onKeyBoardHide();"); Log.i("Screen Size Changed","KeyBoard not displaying" +r.bottom); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); params.height=r.bottom; mWebView.setLayoutParams(params); } lastValue = heightDiff; } } }); 

    Come ha sottolineato @Ankit, andare a una pagina vuota potrebbe aiutare. "circa: vuoto" è meglio, però.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.