2017-05-11 44 views
6

To pytanie zostało już zadane here, ale nie ma rozwiązania.Dlaczego atrybut minHeight nie działa w WebView Android?

Mam WebView. Chcę ustawić minimalną wysokość na WebView przy użyciu atrybutu minHeight, ale to nie działa. Ten sam atrybut działa dla przycisku.

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

wyraźnie z poniższej obrazu, WebView nie wspiera atrybut minHeight. Czy ktokolwiek zna rozwiązanie tego problemu?

enter image description here

+0

w której wersji Android występuje ten problem? – savepopulation

+0

Próbowałem go na Androidzie 25 i stawiłem czoła temu problemowi. Ale myślę, że nie jest to związane z wersją Androida. – thedarkpassenger

+0

Wystąpiły pewne problemy z wyświetlaniem stron internetowych w wersjach pre kit kat. więc zapytałem. – savepopulation

Odpowiedz

7

Najpierw zrozumieć użytkowania android:minHeight atrybut jak innego widoku za. Weźmy na przykład Spinner. W AbsSpinner#onMeasure() kodujemy patrz poniższy fragment kodu:

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

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

setMeasuredDimension(widthSize, heightSize); 
... 

Więc getSuggestedMinimumHeight() powinny być traktowane przy obliczaniu preferowaną wysokość.

Teraz zobaczmy, jak mierzy się WebView.

AwLayoutSizer jest ostatnim elementem, który jest odpowiedzialny za pomiar WebView i we can clearly see, że jego onMeasure() nie przestrzega getSuggestedMinimumHeight() v Alue.

Nie jestem pewien, czy jest to zamierzone zachowanie, czy nie. Niemniej jednak nie mogę znaleźć enough seams, aby w jakiś sposób wpłynąć na ten proces pomiaru. Here's to uchwyt kodu w klasie WebView, w którym zainicjowano obiekt, który ostatecznie powróci WebViewChromium (pierwszy krok w powyższej kolejności).

 

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

Jak widać, nie jest to coś, co można łatwo dostosować/zmienić.

-1

Spróbuj:

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> 

enter image description here

+0

Powinieneś wziąć pod uwagę [ostrzeżenia] (http://i.imgur.com/v1OfFzl.png). – azizbekian

+0

Możemy zrobić to za pomocą kodu. zdefiniować wysokość dla LinearLayout. – MrTy

0

myślę Webview wymiary pracować zgodnie z treścią właściwości widok portu ...

Sprawdź https://developer.android.com/guide/webapps/targeting.html#Viewport

rzutni obszar w którą twoja strona jest narysowana. Mimo że całkowity widoczny obszar ekranu jest zgodny z rozmiarem ekranu podczas przybliżania do końca, rzutnia ma własne wymiary pikseli, które udostępnia stronie internetowej.Na przykład, chociaż ekran urządzenia może mieć szerokość fizyczną równą 480 pikseli, rzutnia może mieć szerokość 800 pikseli. Dzięki temu strona internetowa o szerokości 800 pikseli będzie całkowicie widoczna na ekranie, gdy skala rzutni wynosi 1.0. Większość przeglądarek internetowych na Androida (w tym Chrome) domyślnie ustawiała rzutnię na duży rozmiar (znany jako "tryb szerokiego ekranu" o szerokości około 980 pikseli). Wiele przeglądarek domyślnie pomniejsza tak daleko, jak to możliwe, aby pokazać pełną szerokość okna (znanego jako "tryb przeglądu").

0

użyć układu ograniczeń., Który pomoże rozwiązać wszystkie te typy błędów i jest bardzo łatwy w użyciu.

jeśli twoja wersja studio Android jest poniżej 2.3.1, to dodaj tę zależność.

compile 'com.android.support.constraint:constraint-layout:1.0.0-beta1'