Ответ 1
Вы можете вызвать setBackground()
для Button
чтобы установить фон кнопки.
Любой текст появится над фоном.
Если вы ищете что-то похожее в xml, есть атрибут: android:background
который работает так же.
Я пытаюсь создать изображение (в качестве фона) на кнопке и динамически добавлять, в зависимости от того, что происходит во время выполнения, некоторый текст над/над изображением.
Если я использую ImageButton
, у меня даже нет возможности добавлять текст.
Если я использую Button
, я могу добавить текст, но только определить изображение с android:drawableBottom
и аналогичными атрибутами XML, как определено здесь.
Однако эти атрибуты объединяют только текст и изображение в x- и y-измерениях, то есть я могу нарисовать изображение вокруг моего текста, но не ниже/под моим текстом (с осью z, определяемой как выход из дисплея).
Любые предложения о том, как это сделать? Одна из идей заключалась бы в том, чтобы либо расширить Button
, либо ImageButton
и переопределить метод draw()
. Но с моим текущим уровнем знаний я действительно не знаю, как это сделать (2D-рендеринг). Может быть, кто-то с большим опытом знает решение или, по крайней мере, некоторые указатели, чтобы начать?
Вы можете вызвать setBackground()
для Button
чтобы установить фон кнопки.
Любой текст появится над фоном.
Если вы ищете что-то похожее в xml, есть атрибут: android:background
который работает так же.
Для пользователей, которые просто хотят помещать 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
Там гораздо лучшее решение для этой проблемы.
Просто возьмите нормальный 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" />
Таким образом вы получаете кнопку, которая отображает значок в левой части кнопки и текст в правом месте значка с вертикальной ориентацией.
<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" />
Просто используйте 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>
просто замените
android:background="@drawable/icon"
с
android:background="@android:color/transparent"
android:drawableTop="@drawable/[your background image here]"
izz довольно хороший трюк..;)
Я выбрал другой подход из тех, что указаны здесь, и он работает очень хорошо, поэтому я хотел бы поделиться им.
Я использую стиль для создания пользовательской кнопки с изображением слева и текста в центре справа. Просто выполните 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 с использованием стилей.
Вы также можете создать тему для своего приложения и добавить к ней "родительский стиль", чтобы все кнопки выглядели одинаково и применяли "дочерний стиль" с помощью значка только там, где он вам нужен.
<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"
/>
Вы можете использовать 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" />
Возможно, мое решение подойдет многим пользователям, я надеюсь на это.
Я предлагаю сделать 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" />
И это результат. Затем стилизуйте свою пользовательскую кнопку с любыми цветами или любыми другими свойствами и полями. Удачи
<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/
Этот код отлично работает для меня
<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>
Вы можете использовать это:
<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
, а также добавил текст..!
Не используйте нормальный
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
.Вы можете достичь выхода, как показано ниже -
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/temp"
/>