Android-Schaltfläche mit Symbol und Text

89

Ich habe einige Schaltflächen wie diese in meiner App:

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

Ich versuche, dieselbe Schaltfläche mit Text und einem Symbol zu erstellen. android: drawableLeft funktioniert bei mir nicht (Vielleicht würde es funktionieren, aber ich weiß nicht, wie ich eine maximale Höhe für das Symbol festlegen soll).

Also habe ich ein LinearLayout mit einer ImageView und einer TextView erstellt und es wie eine Schaltfläche wirken lassen:

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

Meine neue Schaltfläche ist genau das, was ich will (Schriftgröße, Symbol und Textplatzierung). Aber es sieht nicht nach meinen Standardschaltflächen aus:

Geben Sie hier die Bildbeschreibung ein

Also habe ich versucht, den Hintergrund und die Textfarbe meines neuen Buttons zu ändern:

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());

Dies führt zu einem seltsamen Ergebnis, mein alter Knopf wird durcheinander gebracht:

Geben Sie hier die Bildbeschreibung ein

Wenn ich die Reihenfolge dieser beiden Schaltflächen im XML ändere, sodass die "neue Schaltfläche" zuerst angezeigt wird, ergibt sich ein weiteres seltsames Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Jetzt ist mir aufgefallen, dass beim Versuch, den alten Knopf zu drücken, der neue gedrückt wird.

Irgendwelche Ideen?

Dusan
quelle

Antworten:

280

Probier diese.

<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"/>
Liem Vo
quelle
3
Das sieht genau so aus, wie ich es will, aber ich möchte meine eigenen Symbole verwenden, nicht die Standard-Android-Symbole. Meine Symbole sind größer. Bedeutet das, dass ich für jede Auflösung kleinere Bitmaps erstellen muss? Gibt es einen Parameter, mit dem ich die Symbolgröße steuern kann?
Dusan
Das ist richtig. Sie müssen für jede Auflösung eine andere Bildgröße erstellen
Liem Vo
Ok, danke für Ihre Hilfe, aber jetzt habe ich noch eine Frage ... Meine Symbole sind hell, weil der Text auf einem dunklen Knopf weiß ist, wie Sie in den Bildern in meiner Frage sehen können. Die App ist so eingestellt, dass sie ein Thema verwendet, das in der Android-Version verfügbar ist. Meine Beispiele sind von Android 4.3. Wenn die App auf Android 2.3.3 ausgeführt wird, sind die Standardschaltflächen hell mit dunklem Text. Ein bisschen wie der Knopf auf meinem ersten Bild. Gibt es eine Möglichkeit, eine alternative Bitmap für das Symbol bereitzustellen, das auf älteren Geräten ausgeführt wird? Ich hoffe du verstehst meine Frage :)
Dusan
Das ist eine gute Frage. Sie können für Ihr Symbol einen anderen Stil definieren, für jede API-Ebene einen Textkühler (dies bedeutet Android OS-Version). Sie können die Ordner values-v11 und values-v14 sehen.
Liem Vo
1
Sie können dem Symbol Android auch eine Auffüllung hinzufügen: drawablePadding = ""
Asad Mirza
15

Um links, rechts, oben oder unten ein Bild hinzuzufügen, können Sie folgende Attribute verwenden:

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

Der Beispielcode ist oben angegeben. Sie können dies auch mithilfe des relativen Layouts erreichen.

user3515854
quelle
Wie mache ich das programmatisch
Sujay UN
1
Man könnte sagen android:drawableStartanstelle von links und android:drawableEndanstelle von rechts.
Simão Garcia
@ SimãoGarcia * sollte. Start sollte rechts ersetzen und Ende sollte an allen Stellen links ersetzen. Dies soll sicherstellen, dass sowohl von rechts nach links als auch von links nach rechts gelesen werden kann, da einige andere Länder anders lesen.
Carson J.
11

Für alle, die dies dynamisch tun möchten, setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)hilft das Objekt auf den Schaltflächen.

Stichprobe

Button search = (Button) findViewById(R.id.yoursearchbutton);
search.setCompoundDrawables('your_drawable',null,null,null);
Kennedy Nyaga
quelle
5
Die Verwendung von setCompoundDrawables spiegelte die Benutzeroberfläche nicht wider. Verwendete stattdessen setCompoundDrawablesWithIntrinsicBounds, und das funktionierte.
Aldo
5

Das ist was du wirklich willst.

<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" />
Shreyansh Tiwari
quelle
3

Sie können die Materialkomponentenbibliothek und die MaterialButtonKomponente verwenden.
Verwenden Sie die Attribute app:iconund app:iconGravity="start".

Etwas wie:

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

Geben Sie hier die Bildbeschreibung ein

Gabriele Mariotti
quelle
Beachten Sie, dass das Standard-Schaltflächen-Widget als MaterialButton automatisch aufgeblasen wird, wenn Sie ein Materialdesign-Thema für Ihre App haben. Per here - material.io/develop/android/components/buttons
dodgy_coder
@dodgy_coder Ja, das ist richtig.
Gabriele Mariotti
1

Die Antwort von @Liem Vo ist richtig, wenn Sie android.widget.Button ohne Überschreiben verwenden. Wenn Sie Ihr Thema mit MaterialComponents überschreiben, wird das Problem dadurch nicht behoben.

Also wenn du bist

  1. Verwenden von com.google.android.material.button.MaterialButton oder
  2. AppTheme mit MaterialComponents überschreiben

Verwenden Sie den Parameter app: icon .

<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" />
Chamin Wickramarathna
quelle