Simge ve metin içeren Android düğmesi


92

Uygulamamda buna benzer bazı düğmeler var:

    <Button
        android:id="@+id/bSearch"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:text="Search"
        android:textSize="24sp" />

Metin ve simgeyle aynı düğmeyi oluşturmaya çalışıyorum. android: drawableLeft benim için çalışmıyor (Belki işe yarar, ancak simgeye maksimum yüksekliği nasıl ayarlayacağımı bilmiyorum).

Bu yüzden bir ImageView ve TextView ile bir LinearLayout oluşturdum ve bir düğme gibi davranmasını sağladım:

    <LinearLayout
        android:id="@+id/bSearch2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@android:drawable/btn_default"
        android:clickable="true"
        android:padding="16dp"
        android:orientation="horizontal" >

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="5dp"
            android:adjustViewBounds="true"
            android:maxHeight="30dp"
            android:maxWidth="30dp"
            android:scaleType="fitCenter"
            android:src="@drawable/search_icon" />

        <TextView
            android:id="@+id/tvSearchCaption"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textSize="24sp"
            android:paddingRight="30dp"
            android:gravity="center"
            android:text="Search" />
    </LinearLayout>

Yeni düğmem tam olarak istediğim şey (yazı tipi boyutu, simge ve metin yerleşimi). Ancak varsayılan düğmelerime benzemiyor:

görüntü açıklamasını buraya girin

Bu yüzden, yeni Button'ımın arka planını ve metin rengini değiştirmeyi denedim:

Button Search = (Button) findViewById(R.id.bSearch);
LinearLayout bSearch2 = (LinearLayout) findViewById(R.id.bSearch2);
bSearch2.setBackground(bSearch.getBackground());
TextView tvSearchCaption = (TextView)findViewById(R.id.tvSearchCaption);
tvSearchCaption.setTextColor(bSearch.getTextColors().getDefaultColor());

Bu garip bir sonuç veriyor, benim eski düğmem karışıyor:

görüntü açıklamasını buraya girin

XML'deki bu iki düğmenin sırasını değiştirdiğimde, "yeni düğme" önce gelir, başka bir garip sonuç verir:

görüntü açıklamasını buraya girin

Şimdi fark ettim ki, eski düğmeye basmaya çalıştığımda yenisine basıldı.

Herhangi bir fikir?

Yanıtlar:


283

Bunu dene.

<Button
    android:id="@+id/bSearch"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:text="Search"
    android:drawableLeft="@android:drawable/ic_menu_search"
    android:textSize="24sp"/>

3
Tam olarak istediğim gibi görünüyor, ancak varsayılan android olanları değil kendi simgelerimi kullanmak istiyorum. Simgelerim daha büyük boyuttadır. Bu, her çözünürlük için daha küçük bitmapler oluşturmam gerektiği anlamına mı geliyor? Simge boyutunu kontrol etmeme izin veren bir parametre var mı?
Dusan

Bu doğru. Her çözünürlük için farklı görüntü boyutunu oluşturmak gerek
Liem Vo

Tamam, yardımın için teşekkürler, ama şimdi başka bir sorum var ... Simgelerim açık, çünkü benim sorumdaki resimlerde de görebileceğiniz gibi karanlık bir düğmedeki metin beyaz. Uygulama, android sürümünde mevcut olan bir temayı kullanacak şekilde ayarlanmıştır. Örneklerim android 4.3'ten. Uygulama android 2.3.3'te çalıştığında, varsayılan düğmeler koyu metinle açık renktedir. İlk resmimdeki düğme gibi bir şey. Eski cihazlarda çalışan simge için alternatif bir bit eşlem sağlamanın bir yolu var mı? Umarım sorumu anlarsın :)
Dusan

Bu güzel bir soru. Simgeniz için farklı bir stil, her API seviyesi için metin daha serin bir tarzda tanımlayabilirsiniz (bu, android işletim sistemi sürümü anlamına gelir). Değerler-v11, değerler-v14 klasörlerini görebilirsiniz.
Liem Vo

2
Simgeye dolgu da ekleyebilirsiniz android: drawablePadding = ""
Asad Mirza

15

Sola, sağa, yukarı veya aşağıya bir resim eklemek için aşağıdaki gibi öznitelikleri kullanabilirsiniz:

android:drawableLeft
android:drawableRight
android:drawableTop
android:drawableBottom

Örnek kod yukarıda verilmiştir. Bunu göreceli düzen kullanarak da elde edebilirsiniz.


Bunu programlı olarak nasıl yaparım
Sujay UN

1
android:drawableStartSol android:drawableEndyerine Sağ yerine diyebilirsiniz .
Simão Garcia

@ SimãoGarcia * gerekir. Her yerde başlangıç ​​sağdan ve son soldan değiştirilmelidir. Bu, sağdan sola okumanın yanı sıra soldan sağa okumanın da mevcut olmasını sağlamak içindir, çünkü diğer bazı ülkeler farklı şekilde okur.
Carson J.

11

Bunu dinamik olarak yapmak isteyen herkes setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)için, düğmeler nesnesi yardımcı olacaktır.

Örneklem

Button search = (Button) findViewById(R.id.yoursearchbutton);
search.setCompoundDrawables('your_drawable',null,null,null);

5
SetCompoundDrawables kullanımı kullanıcı arayüzüne yansımadı. Bunun yerine setCompoundDrawablesWithIntrinsicBounds kullanıldı ve işe yaradı.
Aldo

5

Gerçekten istediğin bu.

<Button
       android:id="@+id/settings"
       android:layout_width="190dp"
       android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
       android:background="@color/colorAccent"
       android:drawableStart="@drawable/ic_settings_black_24dp"
       android:paddingStart="40dp"
       android:paddingEnd="40dp"
       android:text="settings"
       android:textColor="#FFF" />

4

Malzeme Bileşenleri Kitaplığını ve MaterialButtonbileşeni kullanabilirsiniz. Ve niteliklerini
kullanın .app:iconapp:iconGravity="start"

Gibi bir şey:

  <com.google.android.material.button.MaterialButton
        style="@style/Widget.MaterialComponents.Button.Icon"
        app:icon="@drawable/..."
        app:iconGravity="start"
        ../>

görüntü açıklamasını buraya girin


Uygulamanız için bir materyal tasarım temanız varsa, standart Düğme widget'ının MaterialButton olarak otomatik olarak şişirildiğini unutmayın. Buraya göre - material.io/develop/android/components/buttons
dodgy_coder

2

Android.widget.Button'ı herhangi bir geçersiz kılma olmadan kullanıyorsanız @Liem Vo'nun cevabı doğrudur. MaterialComponents kullanarak temanızı geçersiz kılıyorsanız, bu sorunu çözmeyecektir.

Öyleyse eğer

  1. Com.google.android.material.button.MaterialButton veya
  2. MaterialComponents kullanarak AppTheme'yi geçersiz kılma

App: icon parametresini kullanın .

<Button
    android:id="@+id/bSearch"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:text="Search"
    android:textSize="24sp"
    app:icon="@android:drawable/ic_menu_search" />
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.