Jak używać rysowalnego związku zamiast LinearLayout, który zawiera ImageView i TextView


198

Uruchomiłem nowe narzędzie Lint przeciwko mojemu kodowi. Wymyślił wiele dobrych sugestii, ale tej nie rozumiem.

Ten znacznik i jego dzieci można zastąpić jednym i złożonym rysunkiem

Problem: sprawdza, czy bieżący węzeł można zastąpić TextView przy użyciu złożonych rysunków.

LinearLayout, który zawiera ImageView i TextView, może być bardziej efektywnie obsługiwany jako złożony rysunek

A oto mój układ

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_centerInParent="true">

<ImageView 
    android:id="@+id/upImage"
    android:layout_width="20dp"
    android:layout_height="20dp"
    android:layout_gravity="center_vertical"
    android:scaleType="centerInside"
    android:src="@drawable/up_count_big">
</ImageView>

<TextView
    android:id="@+id/LikeCount"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="2dp"
    android:layout_marginBottom="1dp"
    android:textColor="@color/gray"
    android:textSize="16sp"
    android:layout_gravity="center_vertical">
</TextView>
</LinearLayout>

Czy ktoś może podać konkretny przykład, jak w takim przypadku sprawić, by związek był wyciągalny?


4
fwiw to jedna z kontroli, które normalnie wyłączam z powodu fałszywych wyników pozytywnych. Nie wszystkie TextView/ ImageViewkombinacje można zastąpić w ten sposób.
Richard Le Mesurier

@RichardLeMesurier Możesz użyć widoku niestandardowego, jeśli chcesz zdefiniować rozmiar obrazu. Dzięki temu twój widok będzie jaśniejszy. Zobacz moją odpowiedź: stackoverflow.com/a/31916731/2308720
Oleksandr

@Alex Zgadzam się w wielu przypadkach, jednak z własnego doświadczenia często nie warto tworzyć niestandardowego widoku, aby obejść to, co uważam za błędny test Lint.
Richard Le Mesurier,

Odpowiedzi:


258

TextView pochodzi z 4 złożonymi szufladami, po jednej dla każdej lewej, górnej, prawej i dolnej.

W twoim przypadku, to nie potrzebne LinearLayouti ImageViewna wszystkich. Po prostu dodaj android:drawableLeft="@drawable/up_count_big"do swojego TextView.

Zobacz TextView # setCompoundDrawablesWithIntrinsicBounds, aby uzyskać więcej informacji.


34
niekoniecznie, ponieważ Twój link pokazuje przykład z dynamicznym obrazem. W takim przypadku nadal może być łatwiejsze lub lepiej użyć ImageView. Ostrzeżenie mówi „można zastąpić przez”, a nie „należy zastąpić przez”
David O'Meara

9
ale jak mogę zrobić odstęp między obrazem a tekstem
Hitesh Dhamshaniya

7
@Hitesh Dhamshaniya, używając właściwości DrawablePadding w XML lub kodzie.
Snicolas,

2
W moim przypadku przeniosłem się do LinearLayout z wewnętrznym ImageView / TextView, ponieważ android: drawableLeft nie zapewniał wystarczającej kontroli - więc w zasadzie mówisz mi, że to ostrzeżenie / sugestia jest kłamstwem.
BrainSlugs83

5
To nie jest kłamstwo, w niektórych przypadkach pojedynczy TextView może rzeczywiście być skuteczny. Ale ogólnie - tak, ImageView z TextView zapewnia znacznie bogatszą kontrolę.
ǝlǝ

20

jeśli z jakiegoś powodu musisz dodać kod, możesz użyć tego:

mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom);

gdzie lewy, górny, prawy dolny są Drawable


Wymagaj API 17 powyżej
Puni

Nie sądzę, dokumentacja stwierdza od API 1
Javier P

Zobacz ten link [dokumentacja] ( developer.android.com/reference/android/widget/... , android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable))
Puni

tak, zwróć uwagę na krewnego w nazwie metody;) Nie odnoszę się do tego w odpowiedzi
Javier P


1

Możesz użyć ogólnej implementacji złożonego rysunku, ale jeśli chcesz zdefiniować rozmiar rysunku, użyj tej biblioteki:

https://github.com/a-tolstykh/textview-rich-drawable

Oto mały przykład użycia:

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some text"
        app:compoundDrawableHeight="24dp"
        app:compoundDrawableWidth="24dp" />
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.