Mam TextView i chciałbym dodać czarną ramkę wzdłuż górnej i dolnej granicy. Próbowałem dodać android:drawableTop
i android:drawableBottom
do TextView, ale to spowodowało, że cały widok stał się czarny.
<TextView
android:background="@android:color/green"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawableTop="@android:color/black"
android:drawableBottom="@android:color/black"
android:text="la la la" />
Czy istnieje sposób na łatwe dodanie górnej i dolnej ramki do widoku (w szczególności TextView) w Androidzie?
android
border
android-view
textview
emmby
źródło
źródło
Odpowiedzi:
W Androidzie 2.2 możesz wykonać następujące czynności.
Utwórz rysunkowy xml, taki jak /res/drawable/textlines.xml i przypisz go jako właściwość tła TextView.
/res/drawable/textlines.xml
Wadą tego jest to, że musisz określić nieprzezroczysty kolor tła, ponieważ folie nie będą działać. (Przynajmniej myślałem, że tak, ale się myliłem). W powyższym przykładzie widać, że jednolity kolor pierwszego kształtu #FFdddddd jest kopiowany w kolorze obrysu 2. kształtu.
źródło
android:color="@null"
aby uniknąć nieprzezroczystego problemu z tłem.Użyłem lewy, aby ramka była wyświetlana poza kontenerem. W przypadku tej sztuczki rysowana jest tylko linia, aby pokazać tło widoku podstawowego.
źródło
Opcja 1: kształt rysowany
Jest to najprostsza opcja, jeśli chcesz obramować układ lub widok, w którym możesz ustawić tło. Utwórz plik XML w
drawable
folderze, który wygląda mniej więcej tak:Możesz usunąć,
solid
jeśli nie chcesz wypełnienia. Zestawbackground="@drawable/your_shape_drawable"
w twoim układzie / widoku.Opcja 2: Widok tła
Oto mała sztuczka, której użyłem w
RelativeLayout
. Zasadniczo masz czarny kwadrat pod widokiem, który chcesz nadać ramce, a następnie nadaj temu widokowi trochę wypełnienia (nie marginesu!), Aby czarny kwadrat był widoczny na krawędziach.Oczywiście działa to poprawnie tylko wtedy, gdy widok nie ma żadnych przezroczystych obszarów. Jeśli tak, polecam napisać niestandardowy,
BorderView
który tylko rysuje granicę - powinien to być tylko kilkadziesiąt linii kodu.Jeśli zastanawiasz się, to czyni pracę z
adjustViewBounds=true
. Jednak to nie działa, jeśli chcesz mieć tło w całościRelativeLayout
, ponieważ istnieje błąd, który powstrzymuje Cię od wypełnieniaRelativeLayout
znakiemView
. W takim przypadku polecamShape
wyciągnąć.Opcja 3: 9 łatek
Ostatnią opcją jest skorzystanie z 9-patcha, który można wyciągnąć w następujący sposób:
Możesz go użyć w dowolnym widoku, w którym możesz ustawić
android:background="@drawable/..."
. I tak, to musi być 6x6 - próbowałem 5x5 i to nie działało.Wadą tej metody jest to, że nie możesz bardzo łatwo zmieniać kolorów, ale jeśli chcesz fantazyjne obramowania (np. Tylko obramowanie u góry iu dołu, jak w tym pytaniu), możesz nie być w stanie zrobić ich z
Shape
rysowalnym , co nie jest zbyt potężne.Opcja 4: Dodatkowe widoki
Zapomniałem wspomnieć o tej naprawdę prostej opcji, jeśli chcesz tylko ramki powyżej i poniżej widoku. Możesz umieścić swój widok w pionie
LinearLayout
(jeśli jeszcze nie jest), a następnie dodać pusteView
s powyżej i poniżej tak:źródło
Aby dodać
1dp
białą ramkę tylko u dołu i mieć przezroczyste tło, możesz skorzystać z poniższych, co jest prostsze niż większość odpowiedzi tutaj.Dla tego
TextView
lub innego widoku dodaj:A w
drawable
katalogu dodaj następujący kod XML o nazwieborderbottom.xml
Jeśli chcesz mieć ramkę u góry, zmień
android:top="-2dp"
naandroid:bottom="-2dp"
Kolor nie musi być biały, a tło nie musi być przezroczyste.
solid
Nie mogą być wymagane elementem. Będzie to zależeć od twojego projektu (dzięki V. Kalyuzhnyu).Zasadniczo ten plik XML utworzy ramkę przy użyciu kształtu prostokąta, ale następnie wypchnie górną, prawą i lewą stronę poza obszar renderowania dla kształtu. Pozostawia to tylko dolną ramkę.
źródło
-2dp
vs1dp
)? Wydaje się działać, gdy są równe pod względem ilości (-1
i1
).-2dp
wynik był zawsze czysty. Myślę, że był przypadek testowy, w którym wynik nie był czysty. Nie pamiętam, czy był to ekran o niskiej lub wysokiej gęstości, czy nawet starsza wersja Androida (może 2.x).4dp
użyję szerokości skoku, czy powinienem użyć-8dp
do pozycjonowania?-5dp
byłaby wszystkim, co jest potrzebne przy wartości szerokości równej4pd
. Po prostu musiał być nieco większy, aby przekroczyć niedokładność wartości zmiennoprzecinkowej.Aktualnie akceptowana odpowiedź nie działa. W wyniku wygładzania tworzy cienkie pionowe ramki po lewej i prawej stronie widoku.
Ta wersja działa idealnie. Umożliwia także niezależne ustawianie szerokości ramek, a także dodawanie ramek po lewej / prawej stronie, jeśli chcesz. Jedyną wadą jest to, że NIE obsługuje przezroczystości.
Utwórz rysunkowy xml o nazwie
/res/drawable/top_bottom_borders.xml
z poniższym kodem i przypisz go jako właściwość tła TextView .Testowane na Androidzie KitKat przez Marshmallow
źródło
Chciałem więc zrobić coś nieco innego: TYLKO ramkę na dole, aby zasymulować dzielnik ListView. Zmodyfikowałem odpowiedź Piet Delport i otrzymałem to:
Uwaga: użycie px zamiast dp, aby uzyskać dokładnie 1 dzielnik pikseli (niektóre DPI telefonu powodują zniknięcie linii 1dp).
źródło
"@color/background_trans_light"
?Tak jak powiedział @Nic Hubbard, istnieje bardzo łatwy sposób na dodanie linii granicznej.
Możesz zmienić wysokość i kolor tła na cokolwiek chcesz.
źródło
Moje odpowiedzi są oparte na wersji @Emile, ale używam przezroczystego koloru zamiast jednolitego.
Ten przykład narysuje dolną granicę 2dp.
@ color / bgcolor to kolor tła, na którym narysujesz widok z ramką.
Jeśli chcesz zmienić położenie granicy, zmień przesunięcie jednym z:
lub połącz je, aby mieć 2 lub więcej ramek:
źródło
Możesz także zawinąć widok w FrameLayout, a następnie ustawić kolor tła i dopełnienie ramki do tego, co chcesz; jednak widok tekstu ma domyślnie „przezroczyste” tło, dlatego należy zmienić również kolor tła widoku tekstu.
źródło
Dlaczego po prostu nie utworzyć widoku wysokiej rozdzielczości 1dp z kolorem tła? Następnie można go łatwo ustawić w dowolnym miejscu.
źródło
Aby dodać moje rozwiązanie do listy ...
Chciałem półprzezroczystą dolną ramkę, która rozciąga się poza pierwotny kształt (więc półprzezroczysta ramka znajdowała się poza prostokątem nadrzędnym).
Co daje mi;
źródło
Aby to zmienić:
Wolę to podejście w „drawable / top_bottom_border.xml”:
Powoduje to, że obramowania, a nie prostokąt, który pojawi się, jeśli tło ma kolor.
źródło
Najpierw utwórz plik xml z zawartością pokazaną poniżej i nazwij go border.xml i umieść go w folderze układu w katalogu res
Następnie użyj kodu
Spowoduje to utworzenie czarnej linii na górze i na dole TextView.
źródło
Zapisz poniżej kodu
źródło
Oto sposób na osiągnięcie tego.
Pierwszy element do obrysu i drugi do jednolitego tła. Ukrywanie lewej i prawej granicy.
źródło
Najprostszym sposobem dodania obramowań w celu wstawienia obramowań za pomocą
InsetDrawable
, następujące pokaże tylko górną ramkę:źródło
Dodaj plik do res / drawable
Dodaj link do tego pliku do właściwości tła
źródło
Spróbuj owinąć obraz liniowym układem i ustaw jego tło na odpowiedni kolor obramowania wokół tekstu. Następnie ustaw dopełnienie w widoku tekstu na grubość, którą chcesz dla swojej ramki.
źródło
Możesz także skorzystać z 9 ścieżek, aby wykonać swoją pracę. Utwórz go, aby kolorowy piksel nie zwielokrotniał się na wysokości, a tylko przezroczysty piksel.
źródło
źródło
Po prostu dodaj widoki u góry iu dołu
View
źródło
źródło
Po prostu dodaj ten TextView poniżej tekstu, w którym chcesz dodać ramkę
źródło
Aby wymusić odpowiedzi @phreakhead i user1051892 ,
<item android:bottom|android:left|android:right|android:top>
jeśli negatywne, muszą być większe niż<stroke android:width>
. Jeśli nie, obraz przedmiotu zostanie pomieszany z obrazem obrysu i możesz pomyśleć, że te wartości nie działają.źródło