Android: łączenie tekstu i obrazu na przycisku lub ImageButton

Staram się mieć obraz (jako tło) na przycisku i dodawać dynamicznie, w zależności od tego, co dzieje się w czasie wykonywania, jakiś tekst nad obrazem.

Jeśli używam ImageButton nie mam nawet możliwości dodania tekstu. Jeśli używam Button Mogę dodać tekst, ale tylko zdefiniować obrazek z android:drawableBottom i podobnymi atrybutami XML zdefiniowanymi tutaj .

Jednak te atrybuty łączą tylko tekst i obraz w wymiarach x i y, co oznacza, że mogę narysować obraz wokół mojego tekstu, ale Nie poniżej/pod moim tekstem (z osią z zdefiniowaną jako wychodzącą z wyświetlacza).

Jakieś sugestie, jak to zrobić? Jednym z pomysłów byłoby rozszerzenie Button lub ImageButton i nadpisanie metody draw(). Ale z moim obecnym poziomem wiedzy tak naprawdę Nie wiem, jak to zrobić (rendering 2D). Może ktoś z większym doświadczeniem zna jakieś rozwiązanie lub przynajmniej jakieś wskazówki na początek?

Author: Charuක, 2009-10-07

14 answers

Możesz wywołać {[0] } na Button, aby ustawić tło przycisku.

Dowolny tekst pojawi się nad tłem.

Jeśli szukasz czegoś podobnego w xml jest: android:background atrybut, który działa w ten sam sposób.

 193
Author: m_vitaly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-21 22:06:39

Dla użytkowników, którzy chcą tylko umieścić tło, ikonę-obraz i tekst w jednym Button z różnych plików: Ustaw na tle Button, drawableTop/Bottom/Rigth/Left i padding atrybuty.

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/home_btn_test"
        android:drawableTop="@drawable/home_icon_test"
        android:textColor="#FFFFFF"
        android:id="@+id/ButtonTest"
        android:paddingTop="32sp"
        android:drawablePadding="-15sp"
        android:text="this is text"></Button>

Aby uzyskać bardziej wyrafinowany układ, Możesz również użyć RelativeLayout i uczynić go klikalnym.

Tutorial: świetny tutorial, który obejmuje oba przypadki: http://izvornikod.com/Blog/tabid/82/EntryId/8/Creating-Android-button-with-image-and-text-using-relative-layout.aspx

 565
Author: OneWorld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-30 12:07:15

Jest o wiele lepsze rozwiązanie tego problemu.

Weź zwykły Button i użyj atrybutów drawableLeft i gravity.

<Button
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:drawableLeft="@drawable/my_btn_icon"
  android:gravity="left|center_vertical" />

W ten sposób otrzymujesz przycisk, który wyświetla ikonę po lewej stronie przycisku i tekst po prawej stronie ikony wyśrodkowany pionowo.

 319
Author: schlingel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-30 12:09:06

Tutaj wpisz opis obrazka

     <Button
            android:layout_width="0dp"
            android:layout_weight="1"
            android:background="@drawable/home_button"
            android:drawableLeft="@android:drawable/ic_menu_edit"
            android:drawablePadding="6dp"
            android:gravity="left|center"
            android:height="60dp"
            android:padding="6dp"
            android:text="AndroidDhina"
            android:textColor="#000"
            android:textStyle="bold" />
 59
Author: Dhina k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-31 15:47:18

Wystarczy użyć LinearLayout i udawać, że jest to Button - Ustawienie background i klikalne jest kluczem:

<LinearLayout
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:drawable/btn_default"
    android:clickable="true"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="5dp"
        android:src="@drawable/image" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_margin="5dp"
        android:text="Do stuff" />
</LinearLayout>
 48
Author: Kieran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-30 12:09:27

Just replace

android:background="@drawable/icon"

Z

android:background="@android:color/transparent"
android:drawableTop="@drawable/[your background image here]"
Izz niezła sztuczka.. ;)
 41
Author: CMA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-29 06:53:12

Przyjęłam inne podejście niż tutaj, i działa naprawdę dobrze, więc chciałam się nim podzielić.

Używam stylu, aby utworzyć niestandardowy przycisk z obrazkiem po lewej stronie i tekstem po prawej stronie. Po prostu wykonaj 4 "proste kroki" poniżej:

I. Utwórz swoje 9 łatek przy użyciu co najmniej 3 różnych plików PNG i narzędzia, które masz w: / YOUR_OWN_PATH/android-sdk-mac_x86/tools/./ draw9patch Po tym powinieneś mieć:

Button_normal.9.png, button_focused.9.png i button_pressed.9.png

Następnie pobierz lub utwórz ikonę PNG 24x24.

Ic_your_icon.png

Zapisz wszystko w drawable / folderze w projekcie Android.

II. Utwórz plik XML o nazwie button_selector.xml w Twoim projekcie w folderze drawable/. Państwa powinny być takie:

<item android:state_pressed="true" android:drawable="@drawable/button_pressed" />
<item android:state_focused="true" android:drawable="@drawable/button_focused" />
<item android:drawable="@drawable/button_normal" />

III. przejdź do folderu values / i otwórz lub utwórz style.plik xml i utwórz następujący kod XML:

<style name="ButtonNormalText" parent="@android:style/Widget.Button">
    <item name="android:textColor" >@color/black</item>
    <item name="android:textSize" >12dip</item>
    <item name="android:textStyle" >bold</item>
    <item name="android:height" >44dip</item>
    <item name="android:background" >@drawable/button_selector</item>
    <item name="android:focusable" >true</item>
    <item name="android:clickable" >true</item>
</style>

<style name="ButtonNormalTextWithIcon" parent="ButtonNormalText">
    <item name="android:drawableLeft" >@drawable/ic_your_icon</item>
</style>

ButtonNormalTextWithIcon to " dziecięcy styl" ponieważ rozszerza ButtonNormalText ("styl nadrzędny").

Zauważ, że zmieniając drawableft w ButtonNormalTextWithIcon style, na drawableRight, drawableTop lub drawableBottom możesz umieścić ikonę w innej pozycji względem tekstu.

IV. przejdź do layout / folderu, w którym masz swój XML dla interfejsu użytkownika i przejdź do przycisku, w którym chcesz zastosować styl i sprawić, aby wyglądał tak:

<Button android:id="@+id/buttonSubmit" 
android:text="@string/button_submit" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
style="@style/ButtonNormalTextWithIcon" ></Button>

I... voila! Masz swój przycisk z obrazkiem na lewa strona.

Dla mnie, to jest lepszy sposób, aby to zrobić! ponieważ robi to w ten sposób można zarządzać rozmiarem tekstu przycisku oddzielnie od ikony, którą chcesz wyświetlić i użyć tego samego tła, które można narysować dla kilku przycisków z różnymi ikonami, zgodnie z wytycznymi Android UI za pomocą stylów.

Możesz również utworzyć motyw dla swojej aplikacji i dodać do niego "styl rodzica", aby wszystkie przyciski wyglądały tak samo, i zastosować" styl potomny " z ikoną tylko tam, gdzie jej potrzebujesz.

 20
Author: Oscar Salguero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-04 18:13:58
 <Button android:id="@+id/imeageTextBtn" 
        android:layout_width="240dip"
        android:layout_height="wrap_content"
        android:text="Side Icon With Text Button"
        android:textSize="20sp"
        android:drawableLeft="@drawable/left_side_icon"         
        />   
 12
Author: Salman Khursheed Khaleeqi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-20 08:30:37

Możesz użyć drawableTop (również drawableLeft, itd.) dla obrazka i ustawić tekst pod obrazkiem dodając gravity left|center_vertical

<Button
            android:id="@+id/btn_video"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:background="@null"
            android:drawableTop="@drawable/videos"
            android:gravity="left|center_vertical"
            android:onClick="onClickFragment"
            android:text="Videos"
            android:textColor="@color/white" />
 10
Author: Kalai.G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-30 12:07:47

Prawdopodobnie moje rozwiązanie będzie pasować do wielu użytkowników, mam nadzieję.

To, co sugeruję, to tworzenie TextView z Twoim stylem. Działa dla mnie doskonale i ma wszystkie funkcje, takie jak przycisk.

Przede wszystkim stwórzmy styl przycisków, którego możesz używać wszędzie...Tworzę button_with_hover.xml

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape android:shape="rectangle"  >
            <corners android:radius="3dip" />
            <stroke android:width="1dip" android:color="#8dbab3" />
            <gradient android:angle="-90" android:startColor="#48608F" android:endColor="#48608F"  />
        </shape>

        <!--#284682;-->
        <!--border-color: #223b6f;-->
    </item>
    <item android:state_focused="true">
        <shape android:shape="rectangle"  >
            <corners android:radius="3dip" />
            <stroke android:width="1dip" android:color="#284682" />
            <solid android:color="#284682"/>
        </shape>
    </item>
    <item >
        <shape android:shape="rectangle"  >
            <corners android:radius="3dip" />
            <stroke android:width="1dip" android:color="@color/ControlColors" />
            <gradient android:angle="-90" android:startColor="@color/ControlColors" android:endColor="@color/ControlColors" />
        </shape>
    </item>

</selector>

Po Drugie, Pozwala utworzyć przycisk textview.

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="20dip"
    android:layout_gravity="right|bottom"
    android:gravity="center"
    android:padding="12dip"
    android:background="@drawable/button_with_hover"
    android:clickable="true"
    android:drawableLeft="@android:drawable/btn_star_big_off"
    android:textColor="#ffffffff"
    android:text="Golden Gate" />

I to jest wynik. Następnie Styl niestandardowy przycisk z dowolnymi kolorami lub innymi właściwościami i marginesy. Powodzenia

Tutaj wpisz opis obrazka

 6
Author: Jevgenij Kononov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-22 13:42:55
<Button
     android:id="@+id/groups_button_bg"
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:text="Groups"
     android:drawableTop="@drawable/[image]" />


android:drawableLeft
android:drawableRight
android:drawableBottom
android:drawableTop

Http://www.mokasocial.com/2010/04/create-a-button-with-an-image-and-text-android/

 5
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-14 13:40:32

Ten kod działa dla mnie doskonale

<LinearLayout
    android:id="@+id/choosePhotosView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center"
    android:clickable="true"
    android:background="@drawable/transparent_button_bg_rev_selector">

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

     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:text="@string/choose_photos_tv"/>

</LinearLayout>
 5
Author: eyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-24 10:40:36

Możesz użyć tego:

  <Button
                    android:id="@+id/reset_all"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginRight="5dp"
                    android:layout_weight="1"
                    android:background="@drawable/btn_med"
                    android:text="Reset all"
                    android:textColor="#ffffff" />

                <Button
                    android:id="@+id/undo"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:layout_weight="1"
                    android:background="@drawable/btn_med"
                    android:text="Undo"
                    android:textColor="#ffffff" />

W tym umieściłem obrazek jako background, a także dodałem tekst..!

 0
Author: jigar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-30 12:08:09
    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/temp"
        />
 -2
Author: Jayesh Prajapati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-01 08:27:11