Android: объединение текста и изображения на Button или ImageButton

Я пытаюсь создать изображение (в качестве фона) на кнопке и динамически добавлять, в зависимости от того, что происходит во время выполнения, некоторый текст над/над изображением.

Если я использую ImageButton, у меня даже нет возможности добавлять текст. Если я использую Button, я могу добавить текст, но только определить изображение с android:drawableBottom и аналогичными атрибутами XML, как определено здесь.

Однако эти атрибуты объединяют только текст и изображение в x- и y-измерениях, то есть я могу нарисовать изображение вокруг моего текста, но не ниже/под моим текстом (с осью z, определяемой как выход из дисплея).

Любые предложения о том, как это сделать? Одна из идей заключалась бы в том, чтобы либо расширить Button, либо ImageButton и переопределить метод draw(). Но с моим текущим уровнем знаний я действительно не знаю, как это сделать (2D-рендеринг). Может быть, кто-то с большим опытом знает решение или, по крайней мере, некоторые указатели, чтобы начать?

Ответ 1

Вы можете вызвать setBackground() для Button чтобы установить фон кнопки.

Любой текст появится над фоном.

Если вы ищете что-то похожее в xml, есть атрибут: android:background который работает так же.

Ответ 2

Для пользователей, которые просто хотят помещать Background, Icon-Image и Text в один Button из разных файлов: установите на фон Button, drawableTop/Bottom/Rigth/Left и padding атрибуты.

<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>

Для более сложной компоновки вы также можете использовать RelativeLayout и сделать ее интерактивной.

Учебное пособие: Отличное руководство, которое охватывает оба случая: http://izvornikod.com/Blog/tabid/82/EntryId/8/Creating-Android-button-with-image-and-text-using-relative-layout.aspx

Ответ 3

Там гораздо лучшее решение для этой проблемы.

Просто возьмите нормальный Button и используйте атрибуты drawableLeft и gravity.

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

Таким образом вы получаете кнопку, которая отображает значок в левой части кнопки и текст в правом месте значка с вертикальной ориентацией.

Ответ 4

введите описание изображения здесь

     <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" />

Ответ 5

Просто используйте LinearLayout и притворитесь, что это Button - настройка background, а нажатие клавиши - это ключ:

<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>

Ответ 6

просто замените

android:background="@drawable/icon"

с

android:background="@android:color/transparent"
android:drawableTop="@drawable/[your background image here]"

izz довольно хороший трюк..;)

Ответ 7

Я выбрал другой подход из тех, что указаны здесь, и он работает очень хорошо, поэтому я хотел бы поделиться им.

Я использую стиль для создания пользовательской кнопки с изображением слева и текста в центре справа. Просто выполните 4 "простых шага" ниже:

я. Создайте свои 9 патчей, используя по крайней мере 3 разных файла PNG и инструмент, который у вас есть:/YOUR_OWN_PATH/android-sdk-mac_x86/tools/./draw9patch. После этого вы должны:

button_normal.9.png, button_focused.9.png и button_pressed.9.png

Затем загрузите или создайте значок 24x24 PNG.

ic_your_icon.png

Сохраните все в папке drawable/в вашем проекте Android.

II. Создайте XML файл с именем button_selector.xml в своем проекте в папке drawable/. Состояния должны быть такими:

<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. Перейдите в папку values ​​/и откройте или создайте файл styles.xml и создайте следующий код 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 - это "дочерний стиль", потому что он расширяет ButtonNormalText ( "родительский стиль" ).

Обратите внимание, что изменение drawableLeft в стиле ButtonNormalTextWithIcon, на drawableRight, drawableTop или drawableBottom вы можете поместить значок в другое положение относительно текста.

IV. Перейдите в макет/папку, в которой у вас есть XML для пользовательского интерфейса, и перейдите к кнопке, где вы хотите применить стиль, и сделайте так:

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

И... вуаля! Вы получили свою кнопку с изображением слева.

Для меня это лучший способ сделать это! потому что при этом вы можете управлять размером текста кнопки отдельно от значка, который хотите отобразить, и использовать один и тот же фон для нескольких кнопок с разными значками в соответствии с Руководством пользователя UI с использованием стилей.

Вы также можете создать тему для своего приложения и добавить к ней "родительский стиль", чтобы все кнопки выглядели одинаково и применяли "дочерний стиль" с помощью значка только там, где он вам нужен.

Ответ 8

 <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"         
        />   

Ответ 9

Вы можете использовать drawableTop (также drawableLeft и т.д.) для изображения и задать текст под изображением, добавив 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

Возможно, мое решение подойдет многим пользователям, я надеюсь на это.

Я предлагаю сделать TextView с вашим стилем. Он работает для меня отлично, и имеет все функции, как кнопка.

Прежде всего, давайте создадим стиль кнопок, который вы можете использовать везде... Я создаю 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>

Во-вторых, давайте создадим кнопку просмотра текста.

    <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" />

И это результат. Затем стилизуйте свою пользовательскую кнопку с любыми цветами или любыми другими свойствами и полями. Удачи

enter image description here

Ответ 12

Этот код отлично работает для меня

<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>

Ответ 13

Вы можете использовать это:

  <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" />

в том, что я поместил изображение как background, а также добавил текст..!

Ответ 14

Важное обновление

Не используйте нормальный android:drawableLeft т.д.... с векторными объектами рисования, иначе это приведет к падению в более низких версиях API. (Я сталкивался с этим в живом приложении)

Для векторного рисования

Если вы используете векторное рисование, то вы должны

  • Используйте AppCompatTextView/AppCompatButton/AppCompatEditText
  • Используйте app:drawableLeftCompat, app:drawableTopCompat, app:drawableRightCompat, app:drawableBottomCompat, app:drawableStartCompat и app:drawableEndCompat

Для регулярного рисования

Если вам не нужно рисовать вектор, то вы можете

  • использовать android:drawableLeft, android:drawableRight, android:drawableBottom, android:drawableTop
  • Вы можете использовать обычные классы TextView, Button & EditText или AppCompat.

Вы можете достичь выхода, как показано ниже -

output

Ответ 15

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/temp"
        />