Android: объединение текста и изображения с помощью кнопки или кнопки ImageButton - PullRequest
517 голосов
/ 07 октября 2009

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

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

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

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

Ответы [ 15 ]

589 голосов
/ 17 сентября 2010

Для пользователей, которые просто хотят поместить фон, значок-изображение и текст в один 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

335 голосов
/ 14 мая 2011

Существует гораздо лучшее решение этой проблемы.

Просто возьмите обычный 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" />

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

200 голосов
/ 07 октября 2009

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

Любой текст будет отображаться над фоном.

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

64 голосов
/ 10 сентября 2015

enter image description here

     <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" />
55 голосов
/ 04 января 2012

Просто используйте 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>
43 голосов
/ 24 мая 2011

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

android:background="@drawable/icon"

с

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

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

21 голосов
/ 15 сентября 2011

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

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

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

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

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

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>

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

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

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

12 голосов
/ 20 октября 2011
 <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"         
        />   
11 голосов
/ 22 октября 2013

Вы можете использовать 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" />
7 голосов
/ 22 февраля 2017

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

Я предлагаю создать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...