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?
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.