Why does minHeight attribute not work in WebView Android?
android, android-layout, java, view-hierarchy, webview
Solution
First, let's understand how other view's use `android:minHeight` attribute. Let's take `Spinner` for example. In `AbsSpinner#onMeasure()` code we see following chunk of code:
...
preferredHeight = Math.max(preferredHeight, getSuggestedMinimumHeight());
preferredWidth = Math.max(preferredWidth, getSuggestedMinimumWidth());
heightSize = resolveSizeAndState(preferredHeight, heightMeasureSpec, 0);
widthSize = resolveSizeAndState(preferredWidth, widthMeasureSpec, 30);
setMeasuredDimension(widthSize, heightSize);
...
So, `getSuggestedMinimumHeight()` should be regarded when computing preferred height.
Now, let's see how `WebView` is being measured.
- `WebView#onMeasure()` delegates the job to `WebViewChromium#onMeasure()`
- `WebViewChromium#onMeasure()` delegates the job to `AwContents#onMeasure()`
- `AwContents#onMeasure()` delegates the job to `AwLayoutSizer#onMeasure`
`AwLayoutSizer` is the last component that is responsible for measuring `WebView` and we can clearly see, that its `onMeasure()` does not respect `getSuggestedMinimumHeight()` value.
I'm not sure whether this is an intended behavior or no. Nevertheless, I cannot find enough seams to somehow affect that measurement process. Here's the chuck of code in `WebView` class, where the object that eventually would return `WebViewChromium` (the first step in abovementioned order) is initialized.
private void ensureProviderCreated() {
checkThread();
if (mProvider == null) {
// As this can get called during the base class constructor chain, pass the minimum
// number of dependencies here; the rest are deferred to init().
mProvider = getFactory().createWebView(this, new PrivateAccess());
}
}
As you can see, this is not something that can be easily customized/changed.
Problem
This question has already been asked here, but it has no solution. I have a `WebView`. I want to set minimum height to the `WebView` using `minHeight` attribute, but it doesn't work. The same attribute works for Button. ``` <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.anshul.webview.WebActivity"> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="400dp"></WebView> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:minHeight="150dp" android:text="This is a Button. It's minHeight is set to 150 dp and it works !!"/> ``` Clearly from the below image, the WebView is not supporting the `minHeight` attribute. Does anybody knows a solution for this problem?