Почему атрибут minHeight не работает в Android WebView?

Этот вопрос уже задавался здесь, но у него нет решения.

у меня есть WebView, Я хочу установить минимальную высоту WebView с помощью minHeight атрибут, но это не работает. Тот же атрибут работает для кнопки.

<?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 !!"/>

Из рисунка ниже видно, что WebView не поддерживает minHeight приписывать. Кто-нибудь знает решение этой проблемы?

введите описание изображения здесь

4 ответа

Решение

Во-первых, давайте разберемся, как используют другие виды android:minHeight приписывать. Давайте принимать Spinner например. В AbsSpinner#onMeasure() мы видим следующий фрагмент кода:

...
preferredHeight = Math.max(preferredHeight, getSuggestedMinimumHeight());
preferredWidth = Math.max(preferredWidth, getSuggestedMinimumWidth());

heightSize = resolveSizeAndState(preferredHeight, heightMeasureSpec, 0);
widthSize = resolveSizeAndState(preferredWidth, widthMeasureSpec, 30);

setMeasuredDimension(widthSize, heightSize);
...

Так, getSuggestedMinimumHeight() следует учитывать при расчете предпочтительной высоты.

Теперь посмотрим, как WebView измеряется.

AwLayoutSizer последний компонент, который отвечает за измерение WebView и мы можем ясно видеть, что его onMeasure() не уважает getSuggestedMinimumHeight() значение.

Я не уверен, является ли это предполагаемым поведением или нет. Тем не менее, я не могу найти достаточно швов, чтобы как-то повлиять на этот процесс измерения. Вот кусок кода в WebView класс, где объект, который в конечном итоге вернется WebViewChromium (первый шаг в вышеупомянутом порядке) инициализируется.


    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());
        }
    }

Как видите, это не то, что можно легко настроить / изменить.

Я думаю, что размеры веб-просмотра работают больше в соответствии со свойствами порта представления контента...

Проверьте https://developer.android.com/guide/webapps/targeting.html

Окно просмотра - это область, в которой отображается ваша веб-страница. Хотя общая видимая область окна просмотра соответствует размеру экрана при полном уменьшении, область просмотра имеет свои собственные размеры в пикселях, которые она делает доступными для веб-страницы. Например, хотя экран устройства может иметь физическую ширину 480 пикселей, область просмотра может иметь ширину 800 пикселей. Это позволяет веб-странице с шириной 800 пикселей быть полностью видимой на экране при масштабе окна просмотра 1,0. Большинство веб-браузеров на Android (включая Chrome) по умолчанию устанавливают большой размер области просмотра (известный как "режим широкого окна просмотра" при ширине около 980 пикселей). Многие браузеры по умолчанию также уменьшают насколько возможно, чтобы показать полную ширину области просмотра (известный как "режим обзора").

Попытайся:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WebView webView = (WebView)findViewById(R.id.webView);
        webView.loadDataWithBaseURL(null, "<html><body bgcolor=\"#E6E6FA\"> hehehe </body></html>", "text/html", "utf-8", null);

    }



<?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:background="@color/blue"
    android:layout_height="match_parent">
    <LinearLayout
        android:minHeight="300dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        >
        <WebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>


    <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 !!"/>
    </RelativeLayout>

Используйте макет ограничения. Это поможет устранить все эти типы ошибок и очень прост в использовании.

Если ваша версия Android Studio ниже 2.3.1, добавьте эту зависимость.

compile 'com.android.support.constraint:constraint-layout:1.0.0-beta1'
Другие вопросы по тегам