Android: Metin ve görüntüyü Düğme veya ImageButton'da birleştirme


540

Ben bir düğme üzerinde bir görüntü (arka plan olarak) var ve çalışma zamanı sırasında neler olduğuna bağlı olarak, resmin üzerinde / üzerinde bazı metin dinamik olarak eklemek çalışıyorum.

Ben kullanırsanız ImageButtonbile metin eklemek için imkanı yok. Ben kullanırsanız Buttonben metin eklemek ama sadece bir görüntü ile tanımlayabilir android:drawableBottomve tanımlanan benzer bir XML özelliklerini burada .

Ancak bu nitelikler yalnızca metin ve görüntüyü x ve y boyutlarında birleştirir, yani metnimin etrafına bir resim çizebilirim, ancak metnimin altına / altına değil (z ekseni ekranın dışına çıkması olarak tanımlanmış olarak).

Bunu nasıl yapacağımıza dair herhangi bir tavsiye var mı? Fikirlerden biri -mettodu genişletmek Buttonveya ImageButtongeçersiz kılmak draw()olacaktır. Ancak mevcut bilgi seviyemle bunu nasıl yapacağımı gerçekten bilmiyorum (2B oluşturma). Belki daha fazla deneyime sahip bir kişi bir çözüm veya en azından başlamak için bazı işaretler bilir?


9Patch, akıllı çözüm kullan
Kaveh Garshasp

Eğer eğer hi @Charu ක bu kontrol ediniz stackoverflow.com/questions/42968587/...
Mohamed rihan

Yanıtlar:


205

Düğmenin arka planını ayarlamak için setBackground()a Buttontuşunu arayabilirsiniz .

Herhangi bir metin arka planın üzerinde görünecektir.

Xml'de benzer bir şey arıyorsanız android:background, aynı şekilde çalışan öznitelik vardır.


49
Bu rotaya giderseniz, sadece arka plan için basit bir çekilebilir araç kullanmak istemezsiniz. Bir StateListDrawable kullanın (genellikle res / drawable / içindeki <selector> XML dosyası aracılığıyla), böylece çeşitli durumlar için arka planlar tanımlayabilirsiniz (normal, basılı, odaklanmış, devre dışı, vb.).
CommonsWare

Kabul ediyorum, bu soruyu ve cevabımı ara: stackoverflow.com/questions/1533038/…
m_vitaly

1
Ne kadar aptalca. Belgelerde bunu nasıl kaçırmış olabilirim. Hızlı yanıt için ve ayrıca <selector> ile ilgili ipucu için teşekkürler. Bu kesinlikle gelecekte uygulamak istediğim bir şey.
znq

3
ICS 4.0+ sürümlerinde düzgün çalışmaz, görüntü uzar. Bir arka plan ile bir TextView kullanıyordum.
meh

612

Arka Plan, Simge-Görüntü ve Metni Button farklı dosyalardan birine koymak isteyen kullanıcılar için : Bir Buttonarka plan, drawableTop / Bottom / Rigth / Left ve dolgu niteliklerini ayarlayın.

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

Daha karmaşık düzenlemeler için de RelativeLayout(veya başka bir düzen) kullanabilir ve tıklanabilir yapabilirsiniz.

Öğretici: Her iki durumu da kapsayan harika öğretici: http://izvornikod.com/Blog/tabid/82/EntryId/8/Creating-Android-button-with-image-and-text-using-relative-layout.aspx


70
Bunu programlı olarak yapmak b.setCompoundDrawablesWithIntrinsicBound(null,R.drawable.home_icon_test,null,null)yerine android:drawableTopve b.setPadding(0,32,0,0)yerine kullanın android:paddingTop.
Alex Jasmin

3
Düzeni düğme olarak kullanmak aslında oldukça esnek bir yaklaşımdır.
sstn

2
Çekmeceleriniz için kaynak kimlikleri kullanıyorsanız null değerini 0 ile değiştirin
koştu

1
Geriye dönük görüntüyü düğmeye sığdırmak için nasıl ölçekleyebilirim?
Alston

@Stallman Ölçeklendirme için xml tabanlı ve kod tabanlı bir çözüm var: stackoverflow.com/questions/8223936/…
OneWorld

346

Bu sorun için çok daha iyi bir çözüm var.

Sadece bir normal Buttonalın drawableLeftve ve gravityözniteliklerini kullanın .

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

Bu şekilde, düğmenin sol tarafında bir simge ve simgenin sağ tarafındaki metni gösteren bir düğme elde edersiniz dikey olarak .


2
Düğmede bir arka plan rengi seçtiyseniz (bu durumda olması muhtemeldir) bu çözümde bir sorun oluşur. Ardından, tıklamaya veya seçime hiçbir grafik yanıt verilmeyecektir. Bunu işlemek için bir seçici yazabilirsiniz, ancak telefonların varsayılan renklerini alamazsınız.
Vanja

9
Bu çözüm kullanılırsa , Drawable padding özelliğinin çok yararlı olduğunu eklemek istedim .
Nikola Malešević

5
Xml'de çizilebilir simge için yükseklik ve genişlik ayarlamanın bir yolu var mı?
penguru

18
Bu harika bir çözümdür ve ayrıca Android geliştirici sitesinde resmi olarak onaylanmıştır: developer.android.com/guide/topics/ui/controls/button.html
twaddington

3
düğme büyükse ve metin değişken uzunsa, çirkin gibi görünüyor: en soldaki simge ve ortadaki bir yerde metin

67

resim açıklamasını buraya girin

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

4
Basit ve yanlış bir çözüm. Sadece sola hizalama için.
CoolMind

2
@ CoolMind Ben sadece ekli yukarıdaki görüntü için açıklıyorum .. doğru hizalamak istiyorsanız
drawableRight

Bu cevabı okuyana kadar bunu yapmayı bile düşünmemiştim. Bu bir cazibe gibi çalışıyor!
sud007

58

Bir LinearLayout kullanın ve bunun bir a Buttonayarı olduğunu backgroundve tıklanabilir anahtar olduğunu düşünün :

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

1
Tıklanan efekt nasıl eklenir?
frankish

3
En iyi cevap, bu şekilde görünüm ve hislerin% 100'ünü yönetirsiniz ve simgeyi bir sınıra yapıştırmanız gerekmez.
13'te

Frenk eklemek android:onClickgörünümünüze
Giora Guttsait

43

sadece değiştir

android:background="@drawable/icon"

ile

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

izz oldukça iyi bir hile ..;)


21

Burada belirtilenlerden farklı bir yaklaşım izledim ve gerçekten iyi çalışıyor, bu yüzden paylaşmak istedim.

Soldaki görüntüyü ve sağ ortadaki metni içeren özel bir düğme oluşturmak için bir Stil kullanıyorum. Aşağıdaki 4 "kolay adımı" uygulamanız yeterlidir:

I. En az 3 farklı PNG dosyası ve sahip olduğunuz aracı kullanarak 9 yama oluşturun: /YOUR_OWN_PATH/android-sdk-mac_x86/tools/./draw9patch. Bundan sonra sahip olmalısınız:

button_normal.9.png, button_focused.9.png ve button_pressed.9.png

Ardından 24x24 PNG simgesi indirin veya oluşturun.

ic_your_icon.png

Hepsini Android projenizdeki çizilebilir / klasöre kaydedin.

II. Projenizde drawable / klasörün altında button_selector.xml adlı bir XML dosyası oluşturun. Devletler şöyle olmalıdır:

<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. Değerler / klasöre gidin ve styles.xml dosyasını açın veya oluşturun ve aşağıdaki XML kodunu oluşturun:

<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 bir "alt stil" dir çünkü ButtonNormalText'i ("üst stil") genişletmektedir.

ButtonNormalTextWithIcon stilinde drawableLeft öğesini değiştirerek drawableRight, drawableTop veya drawableBottom olarak değiştirdiğinizde simgeyi metne göre başka bir konuma yerleştirebilirsiniz.

IV. Kullanıcı arabirimi için XML'inizin bulunduğu mizanpaja / klasöre gidin ve stili uygulamak ve aşağıdaki gibi görünmesini istediğiniz Düğmeye gidin:

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

Ve ... voilà! Düğmenizi sol tarafta bir resim ile aldınız.

Benim için bunu yapmanın en iyi yolu bu! çünkü bu şekilde, düğmenin metin boyutunu görüntülemek istediğiniz simgeden ayrı olarak yönetebilir ve stilleri kullanarak Android UI Yönergeleri'ne saygı gösteren farklı simgelerle birkaç düğme için aynı arka planı kullanabilirsiniz.

Ayrıca, Uygulamanız için bir tema oluşturabilir ve tüm düğmelerin aynı görünmesi için "ana stil" i ekleyebilir ve "çocuk stilini" yalnızca ihtiyacınız olan simgeyle uygulayabilirsiniz.


İyi iş. İçinde bir ImageView ve TextView ile bir FrameLayout görünüm yaklaşımı kullanıyordum, ama bu yaklaşım daha güzel.
pilcrowpipe

Müthiş bir yaklaşım. Facebook SDK'sı (sürüm 3) giriş düğmesi için aynı yaklaşımı kullanıyor
Someone Somewhere Somewhere

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

11

Resim için drawableTop(ayrıca drawableLeft, vb.) Kullanabilir ve resmin altına metin ekleyerekgravity 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" />

11

Önemli Güncelleme

Normal kullanmayın android:drawableLeftvektör drawables ile ... vb, aksi takdirde olacak çökmesine de alt API sürümleri . (Canlı uygulamada karşılaştım)

Çekilebilir vektör için

Çekilebilir vektör kullanıyorsanız,

  • AndroidX'e taşındınız mı? değilse, önce AndroidX'e geçmelisiniz. Çok basit, androidx nedir ve nasıl taşınır?
  • Sürüm olarak piyasaya sürüldü 1.1.0-alpha01, bu yüzden appcompat sürümü en azından olmalı 1.1.0-alpha01. Mevcut en son sürüm, 1.1.0-alpha02daha iyi güvenilirlik için en son sürümleri kullanın, sürüm notlarına bakın - bağlantı .

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

  • AppCompatTextView/ AppCompatButton/ KullanAppCompatEditText

  • Kullanım app:drawableLeftCompat, app:drawableTopCompat, app:drawableRightCompat, app:drawableBottomCompat, app:drawableStartCompatveapp:drawableEndCompat

Düzenli çekilebilir

Çekilebilir vektöre ihtiyacınız yoksa,

  • Kullanım android:drawableLeft, android:drawableRight, android:drawableBottom,android:drawableTop
  • Sen kullanmak ister düzenli olabilir TextView, Buttonve EditTextya AppCompatsınıflar.

Çıktıyı aşağıdaki gibi elde edebilirsiniz -

çıktı


xmlns:app="http://schemas.android.com/apk/res-auto"Ad alanını kullanıyorum ve bu uygulama uyumlu şeyleri görmüyorum.
Dale

1
@ İsim alanınız doğru, cevabımı güncelledim, For vector drawabletekrar bakın .
Khemraj

@Khemraj Hem çizilebilir hem de metni eklediğiniz resimde gösterildiği gibi tek bir görünümde (TextView veya Button veya başka bir şey) nasıl ortalıyorsunuz?
Ambar Jain

7

Muhtemelen benim çözümüm birçok kullanıcı için uygun olacak, umarım.

Ne önermek senin stil ile TextView yapıyor. Benim için mükemmel çalışıyor ve bir düğme gibi tüm özelliklere sahip.

Her şeyden önce her yerde kullanabileceğiniz düğme stili yapalım ... button_with_hover.xml oluşturuyorum

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

İkincisi, bir metin görünümü düğmesi oluşturalım.

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

Ve bu bir sonuçtur. Ardından özel düğmenizi herhangi bir renk veya diğer özellikler ve kenar boşluklarıyla stilize edin. İyi şanslar

resim açıklamasını buraya girin


Ben henüz yaklaşım doğru gibi görünüyor gibi kodunuzu test etmek rağmen, ama bir mobil app vurgulu etkisi olması nedenini anlamıyorum.
Muhammed Akhtar Zuberi

Uygulamam için fareyle üzerine gelme efekti oluşturdum ve bu uygulama oluşturma sırasında fareyle üzerine gelme efektine ihtiyacım vardı. Ama size kalmış :) Gerekmiyorsa fareyle üzerine gelme efektini silebilirsiniz.
Jevgenij Kononov

Cevabınızı çok iyi bir yaklaşım olduğu için oyladım. Benim tek noktam bir mobil arayüzde nasıl gezinebilirsiniz?
Muhammed Akhtar Zuberi

Oo ... şimdi görüyorum ..: D Yeap, haklısın. Bu imkansız. Fareyle üzerine gelme etkisi çoğunlukla basma efekti içindir. XML sınıfı için sadece yanlış isim
Jevgenij Kononov


5

Bu kod benim için mükemmel çalışıyor

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

Kodunuzu denedim .. işe yarıyor ama her düğme farklı metin boyutları ile, düğme kümesi varsa kodunuzun ana sorunu. Düzeniniz değiştirilecek. Böylece düğmenin her resim konumu farklı bir yerde olacaktır. Iken ortada düz olmalıdır. Bu düğme ile olan şeydir.
Jevgenij Kononov

0

Bunu kullanabilirsiniz:

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

olarak ben bir görüntü koymak var backgroundve ayrıca metin ekledi ..!


0
<Button android:id="@+id/myButton" 
    android:layout_width="150dp"
    android:layout_height="wrap_content"
    android:text="Image Button"
    android:drawableTop="@drawable/myimage"         
    />  

Veya programlı olarak şunları yapabilirsiniz:

Drawable drawable = getResources.getDrawable(R.drawable.myimage);
drawable.setBounds(0, 0, 60, 60);
myButton.setCompoundDrawables(null, drawable, null, null);//to the Top of the Button

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

Bu doğru bir cevap değil çünkü Resim görünümü metni desteklemiyor
Muhammed Fasil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.