android - last - WebView en CoordinatorLayout con CollapsingToolbarLayout
com.android.support:design 26 (6)
Creo que la app:layout_scrollFlags="scroll|enterAlways"
set app:layout_scrollFlags="scroll|enterAlways"
será útil
Me gustaría agregar un WebView en un CoordinatorLayout, teniendo CollapsingToolbarLayout en AppBarLayout. El problema es que WebView se reduce en altura y no llena el espacio debajo de la barra de herramientas, por lo que no es utilizable. También intenté usar WebView como elemento secundario de NestedScrollView: inicialmente no funciona (reduce mi altura de WebView), pero el desplazamiento de mi WebView reducido hace que se llene la ventana gráfica.
Aquí está el diseño que utilicé:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
android:id="@+id/main_content"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="256dp"
android:fitsSystemWindows="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:id="@+id/backdrop"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<WebView
android:id="@+id/article"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
El error ahora está arreglado en la última (22.2.1) biblioteca de soporte de diseño.
Esta biblioteca parece haber solucionado este problema al extender la clase de WebView para agregar el comportamiento de la propiedad: https://github.com/takahirom/webview-in-coordinatorlayout
Intente eliminar el atributo android:fitsSystemWindows="true"
de todas las vistas.
Puedes usar android:fillViewport="true"
para NestedScrollView y layout_height="wrap_content"
para WebView
DisplayMetrics metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
int statusBarHeight = getStatusBarHeight(this);
TypedArray actionbarSizeTypedArray = this.obtainStyledAttributes(new int[]{android.R.attr.actionBarSize});
int actionBarHeight = (int) actionbarSizeTypedArray.getDimension(0, 0);
NestedScrollView nestedScrollView = (NestedScrollView) findViewById(R.id.nsv_scroll);
CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(
CoordinatorLayout.LayoutParams.MATCH_PARENT,
metrics.heightPixels - actionBarHeight - statusBarHeight);
nestedScrollView.setLayoutParams(params);
El método getStatusBarHeight()
:
public int getStatusBarHeight(Context context){
Class<?> c = null;
Object obj = null;
Field field = null;
int x = 0;
int statusBarHeight = 0;
try {
c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
statusBarHeight = context.getResources().getDimensionPixelSize(x);
} catch (Exception e1) {
e1.printStackTrace();
}
return statusBarHeight;
}