Android:在Button或ImageButton上组合文本和图像

znq*_*znq 526 android text image button

我正在尝试在按钮上创建一个图像(作为背景)并动态添加,具体取决于运行时发生的情况,图像上方/上方的一些文本.

如果我使用ImageButton我甚至没有可能添加文本.如果我使用,Button我可以添加文本,但只定义具有此处android:drawableBottom定义的XML属性的图像.

然而,这些属性仅在x和y维度中组合文本和图像,这意味着我可以在文本周围绘制图像,但不能在我的文本下方/下方(z轴定义为从显示中出来).

有关如何做到这一点的任何建议?一个想法是扩展ButtonImageButton覆盖draw()-method.但凭借我目前的知识水平,我真的不知道如何做到这一点(2D渲染).也许有经验的人知道解决方案或至少有一些指针可以开始?

One*_*rld 599

对于只想将背景,图标 - 图像和文本放在 Button不同文件中的用户:在Button背景上设置,drawableTop/Bottom/Rigth/Left和填充属性.

<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>
Run Code Online (Sandbox Code Playgroud)

对于更复杂的安排,您也可以使用RelativeLayout并使其可点击.

教程:伟大的教程,涵盖这两种情况下:http://izvornikod.com/Blog/tabid/82/EntryId/8/Creating-Android-button-with-image-and-text-using-relative-layout.aspx

  • 要以编程方式执行此操作,请使用`b.setCompoundDrawablesWithIntrinsicBound(null,R.drawable.home_icon_test,null,null)`而不是`android:drawableTop`和`b.setPadding(0,32,0,0)`而不是`android: paddingTop`. (70认同)
  • 使用布局作为按钮实际上是一种非常灵活的方法. (3认同)
  • 如果您为可绘制对象使用资源 ID,只需将 null 替换为 0 (3认同)
  • 如何缩放背景图像以适合按钮? (2认同)
  • @Stallman有一个基于xml和基于代码的缩放解决方案:http://stackoverflow.com/questions/8223936/how-can-i-scale-the-background-of-a-button (2认同)

sch*_*gel 341

这个问题有一个更好的解决方案.

只需要正常Button并使用drawableLeftgravity属性.

<Button
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:drawableLeft="@drawable/my_btn_icon"
  android:gravity="left|center_vertical" />
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以获得一个按钮,该按钮在按钮的左侧显示一个图标,并且图标的右侧站点的文本垂直居中.

  • 这是一个很好的解决方案,也在Android开发者网站上正式认可:http://developer.android.com/guide/topics/ui/controls/button.html (18认同)
  • 只是想添加_Drawable padding_属性在使用此解决方案时非常有用. (9认同)
  • 有没有办法在xml中为drawable图标设置高度和宽度? (5认同)
  • 如果按钮很大并且文本变长,则看起来像丑陋:最左边的图标和中间某处的文字 (3认同)
  • 如果您选择在按钮上具有背景颜色(在这种情况下很可能),则此解决方案会出现问题.然后,点击或选择将没有图形响应.你可以编写一个选择器来处理这个,但是你不会得到手机的默认颜色. (2认同)

m_v*_*aly 200

您可以调用setBackground()a Button来设置按钮的背景.

任何文本都将显示在背景上方.

如果你在xml中寻找类似的东西,那么: android:background属性的工作方式相同.

  • 如果你走这条路线,你不想只为背景使用一个简单的drawable.使用StateListDrawable(通常通过res/drawable /中的<selector> XML文件),这样您就可以定义各种状态的背景(正常,按下,聚焦,禁用等). (49认同)
  • 它在ICS 4.0+版本上无效,图像延伸.我正在使用带背景的TextView. (3认同)
  • 多么愚蠢。我怎么会在文档中遗漏了这一点。感谢您的快速回答以及 &lt;selector&gt; 的提示。这是我将来绝对想实施的。 (2认同)

Dhi*_*a k 65

在此输入图像描述

     <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" />
Run Code Online (Sandbox Code Playgroud)

  • 一个简单错误的解决方案.仅用于左对齐. (4认同)
  • @ CoolMind我只是解释了我已经附加的上面图像..如果你想要正确对齐使用drawableRight (2认同)

Kie*_*ran 56

只需使用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>
Run Code Online (Sandbox Code Playgroud)

  • 最好的答案,这样你可以管理100%的外观和感觉,而不必将图标粘贴到边框上. (3认同)

CMA*_*CMA 43

只是替换

android:background="@drawable/icon"
Run Code Online (Sandbox Code Playgroud)

android:background="@android:color/transparent"
android:drawableTop="@drawable/[your background image here]"
Run Code Online (Sandbox Code Playgroud)

izz是一个很好的技巧..;)


Osc*_* S. 21

我从这里提到的方法采取了不同的方法,它工作得非常好,所以我想分享它.

我正在使用Style创建一个自定义按钮,左侧是图像,右侧是文本.只需按照下面的4个"简单步骤":

I.使用至少3个不同的PNG文件和您拥有的工具创建9个补丁:/ 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

将所有内容保存在Android项目的drawable /文件夹中.

II.在drawable /文件夹下的项目中创建名为button_selector.xml的XML文件.州应该是这样的:

<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" />
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

ButtonNormalTextWithIcon是一个"子样式",因为它正在扩展ButtonNormalText("父样式").

请注意,将ButtonNormalTextWithIcon样式中的drawableLeft更改为drawableRight,drawableTop或drawableBottom,可以将图标放置在相对于文本的其他位置.

IV.转到您拥有用于UI的XML的布局/文件夹,然后转到要应用样式的Button,并使其如下所示:

<Button android:id="@+id/buttonSubmit" 
android:text="@string/button_submit" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
style="@style/ButtonNormalTextWithIcon" ></Button>
Run Code Online (Sandbox Code Playgroud)

而且......瞧!你的按钮左侧有一个图像.

对我来说,这是更好的方法!因为这样做,您可以单独管理要显示的图标的按钮文本大小,并使用相同的背景可绘制几个按钮,使用不同的图标,使用样式的Android UI准则.

您还可以为应用程序创建主题并为其添加"父样式",以便所有按钮看起来都相同,并将"子样式"仅应用于您需要的图标.


小智 12

 <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"         
        />   
Run Code Online (Sandbox Code Playgroud)


Cri*_*tan 12

MaterialButton支持设置图标并将其与文本对齐:

<com.google.android.material.button.MaterialButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="My button"
        app:icon="@drawable/your_icon"
        app:iconGravity="textStart"
        />
Run Code Online (Sandbox Code Playgroud)

app:iconGravity如果您想将图标与按钮而不是其中的文本对齐,也可以是 to start/ 。end


从1.5.0-beta01版本开始,app:iconGravity也可以top/ textTop( commit )

带 iconGravity 顶部的 MaterialButton


Kal*_*i.G 11

您可以使用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" />
Run Code Online (Sandbox Code Playgroud)


Khe*_*raj 8

重要更新

请勿android:drawableLeft对矢量可绘制对象使用普通等...,否则它将在较低的API版本中崩溃。(我已经在实时应用程序中遇到过)

对于矢量可绘制

如果使用矢量可绘制,则必须

  • 您已迁移到AndroidX吗?如果不是,则必须先迁移到AndroidX。这很简单,看看什么是androidx,以及如何迁移?
  • 它是在版本中发布的1.1.0-alpha01,因此appcompat版本应该至少是1.1.0-alpha01。当前最新版本是1.1.0-alpha02,请使用最新版本以获得更好的可靠性,请参阅发行说明-link

    implementation 'androidx.appcompat:appcompat:1.1.0-alpha02'

  • 使用AppCompatTextView/ AppCompatButton/AppCompatEditText

  • 使用app:drawableLeftCompatapp:drawableTopCompatapp:drawableRightCompatapp:drawableBottomCompatapp:drawableStartCompatapp:drawableEndCompat

对于常规可绘制

如果不需要矢量可绘制,则可以

  • 使用android:drawableLeftandroid:drawableRightandroid:drawableBottomandroid:drawableTop
  • 您可以使用常规TextViewButtonEditTextAppCompat类。

您可以实现如下输出

输出


Jev*_*nov 7

可能我的解决方案适合很多用户,我希望如此.

我建议你用你的风格制作TextView.它非常适合我,并且具有所有功能,例如按钮.

首先让make按钮样式,你可以在任何地方使用...我正在创建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>
Run Code Online (Sandbox Code Playgroud)

其次,让我们创建一个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" />
Run Code Online (Sandbox Code Playgroud)

这就是结果.然后使用任何颜色或任何其他属性和边距设置自定义按钮的样式.祝好运

在此输入图像描述


Sam*_*Sam 6

<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
Run Code Online (Sandbox Code Playgroud)

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


eya*_*yal 5

这段代码非常适合我

<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>
Run Code Online (Sandbox Code Playgroud)