Układ androida: ten znacznik i jego elementy podrzędne można zastąpić jednym <TextView /> i złożonym rysowalnym

116

Kiedy uruchamiam układ na określonym pliku XML, otrzymuję to:

 This tag and its children can be replaced by one <TextView/> 
and a compound drawable

Jaką zmianę należy wprowadzić dla następującego kodu xml:

<LinearLayout android:id="@+id/name_layout"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:background="@drawable/grouplist_single_left_grey_area" >
                <ImageView android:id="@+id/photo_image"
                    android:layout_width="@dimen/thumbnail_width"
                    android:layout_height="@dimen/thumbnail_height"
                    android:paddingBottom="5dip"
                    android:paddingTop="5dip"
                    android:paddingRight="5dip"
                    android:paddingLeft="5dip"
                    android:layout_marginRight="5dip"
                    android:clickable="true"
                    android:focusable="true"
                    android:scaleType="fitCenter"
                    android:src="@*android:drawable/nopicture_thumbnail"
                    android:background="@drawable/photo_highlight" />
                <TextView android:id="@+id/name"
                    android:paddingLeft="5dip"
                    android:layout_weight="1"
                    android:layout_width="0dip"
                    android:layout_height="wrap_content"
                    android:gravity="center_vertical"
                    android:textAppearance="?android:attr/textAppearanceLarge" />
            </LinearLayout>

Tak to wygląda na ekranie:

wprowadź opis obrazu tutaj

Ikona aparatu jest domyślna. Kliknięcie tego daje użytkownikowi możliwość wyboru innego obrazu.

pdilip
źródło
3
+1, ponieważ ta sytuacja wygląda na bardziej złożoną, niż może być obsłużona przez złożenie do rysowania. Gdybyś nie zaakceptował odpowiedzi Romaina, mógłbyś otrzymać bardziej szczegółową odpowiedź.
AlbeyAmakiir

Odpowiedzi:

153

Aby rozwinąć odpowiedź Romaina Guya, oto przykład.

Przed:

<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:layout_marginTop="10dp"  
android:padding="5dp" >

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="My Compound Button" />

<ImageView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/my_drawable" />
</LinearLayout>

Po:

<TextView  
    android:layout_marginTop="10dp"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:text="My Compound Button" 
    android:drawableRight="@drawable/my_drawable" android:padding="5dp" />
NPike
źródło
45
Ładne. Ale co, jeśli muszę ustawić właściwości na rysowalnym, na przykład zdefiniować go na 60dip x 60dip?
Kyle Clegg
4
Hej, spójrz na to, wszystko, co musiałem zrobić, to szukać. stackoverflow.com/a/6671544/1224741
QED
@KyleClegg, Jest to możliwe dzięki własnej bibliotece. Zobacz moją odpowiedź - stackoverflow.com/a/41347470/2308720
Oleksandr
102

Scal TextViewi ImageVieww jeden, używając setCompoundDrawable*()metod TextView lub używając android:drawableLeft.

Romain Guy
źródło
30
Czy mógłbyś wskazać mi przykład ilustrujący, jak można to zrobić? Nie jestem pewien, jak wszystkie atrybuty w ImageView mogą zostać uwzględnione w systemie Android: drawableLeft. Dziękuję
pdilip
1
A co z atrybutami ImageViews, takimi jak scaleType?
neteinstein
2
Jak zwiększyć odstęp między obrazem a tekstem?
TharakaNirmana
2
setCompoundDrawable * () nie działa, zamiast tego użyj setCompoundDrawablesWithIntrinsicBounds ()
Kimo_do
1
@Kimo_do, setCompoundDrawable()nie zajmie się twoim rysunkiem w takiej postaci, w jakiej jest, musisz go wywołać setBounds(patrz API ). Aby go ustawić, możesz uzyskać poprzednie ograniczenia za pomocą TextView.getCompoundDrawables(), uzyskując dostęp do prawidłowego indeksu do rysowania i ostatecznie wywołując getBounds().
Avinash R
3

Czasami można zamienić ImageView(lub wiele) na TextViewjeden TextViewze złożonymi rysunkami. Nie ma wielu parametrów, które można zastosować do złożonego, rysowanego za pomocą natywnego interfejsu API i tej biblioteki TextViewRichDrawable , ale jeśli możesz zarządzać jednym TextView zamiast korzystać z LinearLayout, zdecydowanie powinieneś go używać .

Lista atrybutów i parametrów, które można zastosować do złożonych rysunków:

Rozmiar: ( TAK, naprawdę ):

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Some text"
    app:compoundDrawableHeight="24dp"
    app:compoundDrawableWidth="24dp"/>

Nawet ustaw zasób wektorowy jako możliwy do rysowania:

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Some text"
    app:drawableTopVector="@drawable/some_vector_drawble"
    app:drawableEndVector="@drawable/another_vector_drawable" />

Drawable's Padding using natywnego API android:drawablePadding-> link

Oto przykład:

textView rich drawable

Oleksandr
źródło
2

LinearLayoutKtóry zawiera ImageViewi TextViewmoże być bardziej skutecznie traktować jako rozciągliwej związek (pojedynczy TextView, za pomocą drawableTop, drawableLeft, drawableRight i / lub drawableBottomatrybutów zwrócić jeden lub więcej obrazów sąsiadujące tekście).

Jeśli dwa widgety są przesunięte względem siebie za pomocą marginesów, można to zastąpić drawablePaddingatrybutem.

We wtyczce Eclipse znajduje się szybka naprawa kłaczków do wykonania tej konwersji.

Od: Oficjalne dokumenty API Androida!

ilikyar
źródło
2

Dodaj tools:ignore="UseCompoundDrawables"do <LinearLayout>.

CoolMind
źródło
1

Kiedy postępowałem zgodnie z powyższym kodem, tekst wewnątrz TextView nie jest poprawnie ustawiany. Musisz ustawić jego grawitację na środku | zacząć osiągnąć to, co pokazano w zadanym pytaniu.

Widok tekstu wygląda następująco:

   <TextView
        android:id="@+id/export_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:drawableLeft="@drawable/up_arrow"
        android:drawableStart="@drawable/up_arrow"
        android:gravity="center|start"
        android:text="....."
        android:textSize="@dimen/font_size15" >
    </TextView>
Vikas
źródło
0

Jeśli nie chcesz zmieniać ImageView i TextView, możesz zmienić wersję w pliku AndroidManifest.xml jako:

    <uses-sdk`
    android:minSdkVersion="8"
    android:targetSdkVersion="18" 
    />

Jeśli Twoja wersja to android: targetSdkVersion = "17" zmień ją na "18".

Mam nadzieję, że to naprawi. Zrobiłem to i dobrze to zrobiłem

Dunken_sai
źródło
-2

Innym podejściem jest osadzenie ViewImage w innym LinearLayout (pozwala obsłużyć go z samym id):

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >    
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/blue_3"
            android:layout_gravity="center_horizontal"
            android:paddingTop="16dp" />
    </LinearLayout>
    <TextView 
        android:id="@+id/tvPrompt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:paddingTop="16dp"
        android:text="@string/xy" />

Harvey Triana
źródło
Jaka byłaby z tego korzyść? I dlaczego dwukrotnie ustawiasz przestrzeń nazw?
ygesher
-5
    This tag and its children can be replaced by one <TextView/> and a compound drawable



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

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:contentDescription="."
        android:padding="3dp" 
        android:src="@drawable/tab_home_btn">
    </ImageView>

    <TextView
        android:id="@+id/textview"       
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="首页"
        android:textSize="10sp"
        android:textColor="#ffffff">
    </TextView>

</LinearLayout>
andro_stackoverflow
źródło