9

Questo è il mio layout. Quando carico google.com, l'altezza della webview continua a crescere indefinitamente. La funzione onSizeChange della webview continua a essere chiamata e posso vedere che la webview continua ad espandersi indefinitamente. Ho provato 22.2.1 e 23.1.0 delle librerie di progettazione e appcompat e nessun effetto.altezza webview cresce indefinitamente all'interno di un nestedScrollView

Qualsiasi soluzione? : - |

<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@android:color/black"> 

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="fill_vertical" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <com.example.ajay.scrollabletoolbar.MyWebView 
     android:id="@+id/webview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true"/> 
</android.support.v4.widget.NestedScrollView> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appbarlayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/restricted_browser_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?actionBarSize" 
     android:background="@color/colorPrimary" 
     app:layout_scrollFlags="scroll|enterAlways"> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="#FFFFFF" 
      android:descendantFocusability="beforeDescendants" 
      android:focusableInTouchMode="true"> 

      <EditText 
       android:id="@+id/current_url" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_centerVertical="true" 
       android:backgroundTint="@android:color/darker_gray" 
       android:dropDownAnchor="@+id/restricted_browser_toolbar" 
       android:hint="hint hint" 
       android:imeOptions="actionGo|flagNoExtractUi" 
       android:inputType="textNoSuggestions|textUri" 
       android:paddingBottom="8dp" 
       android:paddingEnd="8dp" 
       android:paddingStart="8dp" 
       android:singleLine="true"/> 

      <ImageView 
       android:id="@+id/clear_url_text" 
       android:layout_width="48dp" 
       android:layout_height="48dp" 
       android:layout_alignRight="@+id/current_url" 
       android:layout_centerVertical="true" 
       android:layout_marginRight="8dp" 
       android:src="@android:drawable/ic_menu_close_clear_cancel" 
       android:visibility="gone"/> 
     </RelativeLayout> 
    </android.support.v7.widget.Toolbar> 
</android.support.design.widget.AppBarLayout> 

+0

Impostarlo a dimensione fissa – Nanoc

+1

Non penso di poter usare una dimensione fissa. voglio che la webview prenda la finestra piena in tutti i telefoni e tablet. – onusopus

+0

Certo che puoi, facile come impostare le dimensioni della finestra per la visualizzazione Web, perché pensi di non poterlo? – Nanoc

risposta

5

In una sola frase, basta non può mettere il WebView all'interno NestedScrollView. Funziona come previsto.

Se si mette un WebView all'interno NestedScrollView (o ScrollView), i tuoi WebView misure sue dimensioni con View.MeasureSpec.UNSPECIFIED requisito. Non importa che tu abbia impostato MATCH_PARENT o anche una dimensione fissa come 100dp per l'altezza del tuo WebView. NestedScrollView obbliga i suoi bambini a misurarsi con il requisito View.MeasureSpec.UNSPECIFIED. Succede tutto al metodo NestedScrollViewmeasureChild(). Va come di seguito:

@Override 
protected void measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) { 
    ViewGroup.LayoutParams lp = child.getLayoutParams(); 
    int childWidthMeasureSpec; 
    int childHeightMeasureSpec; 
    childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, getPaddingLeft() 
      + getPaddingRight(), lp.width); 
    childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 
    child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 
} 

E MeasureSpec.UNSPECIFIED mezzi, come suggerisce il marchio, può essere qualsiasi dimensione che vuole. Penso che questa diapositiva di "Writing Custom Views for Android" session at Google I/O 2013 ti aiuterà a capirlo.

enter image description here

In realtà questo è un problema che è stato discusso in this thread, e secondo this Google engineer,

Questo è come se nel desktop, si ridimensiona la finestra del browser per altezza della pagina in modo che non è possibile scorrere verticalmente. Lo scorrimento avviene in NestedScrollView anziché nella stessa webview. Quindi una conseguenza di no js nella pagina vede qualsiasi evento di scorrimento, quindi non si sa che si è spostato alla fine della pagina caricare più contenuti.

Quindi, linea di fondo è, NON mettere il vostro WebView all'interno NestedScrollView. Si dovrebbe lasciare che WebView scorrano la pagina Web stessa. Buona programmazione! :)

0

Mi scuso per non aver chiuso questa domanda in precedenza. Non possiamo inserire una webview all'interno di nestedScrollView. Ma la natura di un NSV, espande il suo bambino fino alla sua piena altezza in modo da farlo funzionare come previsto con barre degli strumenti per ottenere una barra degli strumenti pieghevole o scorrevole, ecc. Quindi, se viene aggiunta la webview, la webview crescerà indefinitamente o in una grande valore e quindi non funzionerà come previsto. questo può essere un ref: code.google.com/p/android/issues/detail?id=198965