2012-02-07 19 views
31

Mój plik układu definiuje WebView, pod którym znajdują się niektóre przyciski o stałej wysokości.Jak dodać dopełnienie wokół WebView

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:fadingEdge="none"> 

    <WebView 
    android:id="@+id/webview" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1.0"/> 

    <LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="60dp" 
    android:padding="8dp"> 

    <Button 
     android:text="Decline" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1.0"> 
    </Button> 

    <Button 
     android:text="Accept" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1.0"> 
    </Button> 

    </LinearLayout> 
</LinearLayout> 

Próbuję dodać wyściółkę wokół WebView, jak w tej chwili ten tekst biegnie aż do krawędzi UI.

Próbowałem dodać android:padding="8dp" do WebView, ale nie dodano dopełnienia. Próbowałem też paddingLeft i paddingRight również, ale one też nie działały.

Dokumenty API potwierdzają, że dziedziczy on z widoku, który obsługuje atrybut android:padding, więc jestem zaskoczony, że to nie zadziałało.

Czy ktoś wie, czy jest to znany problem, czy jakaś interakcja z mojego układu XML, którego nie rozumiem?

FYI, mój obejście było umieścić dodatkowy LinearLayout wokół WebView i dodać padding na tym, że zamiast:

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1.0" 
    android:padding="8dp"> 

    <WebView 
     android:id="@+id/webview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 

    </LinearLayout> 
+0

Wypróbuj marginesy zamiast dopełnienia - myślę, że tego właśnie chcesz. Wypełnienie naprawdę nie ma sensu dla WebView imo – AJcodez

+0

Dobry pomysł, jednak po prostu próbowałem ustawić layout_marginRight i layout_marginLeft w WebView w moim oryginalnym formacie XML, co spowodowało, że przyciski poniżej nie były wyświetlane. Zastanawiam się, czy coś jest nie tak z powodu mojego układu? –

+0

Wygląda na to, że twój layout_weight jest ustawiony niepoprawnie. Po co dawać guziki layout_weight, jeśli są one wrap_content? – AJcodez

Odpowiedz

32

WebView ma błąd w implementacji dopełnienia. Ustawienie wyściółki w widoku webowym nie spowoduje wstawienia rzeczywistej strony internetowej, ale wypełni paski przewijania. Działa tylko częściowo zgodnie z oczekiwaniami. Twoje rozwiązanie jest najlepszym sposobem na uzyskanie "dopełnienia" dla WebView.

+1

Czy wiesz, czy powinno działać ustawienie layout_marginRight i layout_marginLeft dla WebView? –

+0

tak, to powinno działać. – zrgiu

+0

Czy to nadal sprawa? Lub zostało naprawione i jest teraz sposób na dodanie dopełnienia? (bez rozwiązań css/javascript). – wtk

-1

Korzystanie wyściółkę NIE obejść tutaj. dopełnienie dla układu jest tam w tym celu.

Twoje "obejście" jest tym, co powinieneś był zrobić.

+0

Czy mówisz, że wartość android: padding nie może być ustawiona w WebView? –

+0

Jeśli spojrzysz na kod źródłowy TextView.java, uwzględnia on dopełnienie w onDraw(). Ale WebView.java tego nie robi. To wyjaśni, dlaczego. – JonA

2

Wystarczy spróbować, aby dodać CSS:

<body style='margin:X;padding:X;'> 
+2

Nie sądzę, że ta odpowiedź jest istotna dla pytania. Rozumiem, że może to faktycznie zadziałać, ale pytanie dotyczy problemu z układem Android, a nie treści html wyświetlanej w 'WebView'. –

+0

Dzięki za rozwiązanie. Jest to lepszy sposób na dodanie dopełnienia do widoku internetowego, ponieważ tradycyjne nie działa na zawartość. –

17

Innym Rozwiązaniem tego problemu może być użycie języka JavaScript. Więc, gdy strona jest ładowana można zrobić takie js zadzwonić do ustawiania Podkładki:

webView.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onPageFinished(WebView view, String url) { 
     webView.loadUrl("javascript:document.body.style.margin=\"8%\"; void 0"); 
    } 
}); 
+3

To wspaniałe rozwiązanie dla mnie, dziękuję bardzo! – Booger

+0

Plus jeden za "void 0". Bez tego javascript nie jest uruchamiany. –

1

Dodaj LinearLayout adround go z wyściółką.

+0

odpowiedzi powinny zawierać kod to jest komentarz –

2

Alternatywne podejście byłoby ustawić WebView wewnątrz Scrollview

Następnie można dodać margines lewy/prawy do WebView i będzie uzyskać efekt dopełnienia. Przewijanie będzie jednak obsługiwane przez ScrollView.

<ScrollView style="@style/MatchMatch"> 

    <WebView 
     android:id="@+id/my_web_view" 
     android:layout_marginLeft="@dimen/webViewMargin" 
     android:layout_marginRight="@dimen/webViewMargin" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 
</ScrollView> 

Spowoduje to umieszczenie paska przewijania poza WebView, co jest zachowaniem, które chciałem dla mojej aplikacji.

+1

Dlaczego scrollview? Prosty FrameLayout po prostu zadziała i nie będziesz musiał przejmować się możliwymi zagnieżdżonymi problemami przewijania. –

+1

Wybrałem ScrollView, ponieważ chciałem, aby pasek przewijania był ustawiony na krawędzi ScrollView. Gdybym użył FrameLayout, pasek przewijania będzie przeciwko wewnętrznej przeglądarce. – Voski

+0

To najlepszy sposób na uzyskanie tego samego efektu wizualnego. Podejście oparte na marginesie powoduje zachowanie przewijania, które wygląda źle. Jednak obecnie lepszym rozwiązaniem może być użycie 'NestedScrollView'. –

Powiązane problemy