アイコンとテキストのAndroidボタン


92

私のアプリには次のようなボタンがいくつかあります。

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

テキストとアイコンで同じボタンを作成しようとしています。android:drawableLeftは私には機能しません(多分それは機能しますが、アイコンに最大の高さを設定する方法がわかりません)。

そこで、ImageViewとTextViewを使用してLinearLayoutを作成し、ボタンのように機能させました。

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

私の新しいボタンはまさに私が欲しいものです(フォントサイズ、アイコン、テキストの配置)。しかし、それは私のデフォルトのボタンのようには見えません:

ここに画像の説明を入力してください

そこで、新しいボタンの背景とテキストの色を変更しようとしました。

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

これは奇妙な結果をもたらします、私の古いボタンはめちゃくちゃになります:

ここに画像の説明を入力してください

XMLでこれら2つのボタンの順序を変更して、「新しいボタン」が最初に表示されると、別の奇妙な結果になります。

ここに画像の説明を入力してください

古いボタンを押そうとすると、新しいボタンが押されることに気づきました。

何か案は?

回答:


283

これを試してください。

<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
それは私が望むように正確に見えますが、デフォルトのAndroidアイコンではなく、自分のアイコンを使用したいと思います。私のアイコンは大きいサイズです。つまり、解像度ごとに小さなビットマップを作成する必要がありますか?アイコンのサイズを制御できるパラメータはありますか?
Dusan 2014

それは正しいです。解像度ごとに異なる画像サイズを作成する必要があります
Liem Vo

わかりました、あなたの助けに感謝します、しかし今私は別の質問があります...あなたが私の質問の画像で見ることができるように、テキストが暗いボタンで白いので、私のアイコンは明るいです。アプリは、Android版で利用可能なテーマを使用するように設定されています。私の例はアンドロイド4.3からのものです。アプリがAndroid2.3.3で実行されている場合、デフォルトのボタンは明るいテキストで暗いテキストになります。ちょっと私の最初の画像のボタンのようなもの。古いデバイスで実行されているアイコンに代替ビットマップを提供する方法はありますか?私の質問を理解していただければ幸いです:)
Dusan 2014

それは良い質問です。アイコンに異なるスタイルを定義したり、APIレベルごとにテキストクーラーのスタイルを定義したりできます(Android OSバージョンを意味します)。値-v11、値-v14フォルダーを確認できます。
Liem Vo 2014

2
アイコンにパディングを追加することもできますandroid:drawablePadding = ""
Asad Mirza

15

左、右、上、または下に画像を追加するには、次のような属性を使用できます。

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

サンプルコードは上記のとおりです。相対レイアウトを使用してこれを実現することもできます。


これをプログラムで行うにはどうすればよいですか
Sujay UN 2017

1
android:drawableStart左の代わりに、そしてandroid:drawableEnd右の代わりに言うことができます。
シモンガルシア

@SimãoGarcia*する必要があります。すべての場所で、開始は右に置き換え、終了は左に置き換える必要があります。これは、他の国では読み方が異なるため、右から左への読みと左から右への読みが利用できるようにするためです。
カーソン

11

これを動的に実行しようとしsetCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)ている人は、ボタンオブジェクトが役立ちます。

サンプル

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

5
setCompoundDrawablesの使用は、UIに反映されませんでした。代わりにsetCompoundDrawablesWithIntrinsicBoundsを使用しましたが、それは機能しました。
アルド

5

これはあなたが本当に欲しいものです。

<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

マテリアルコンポーネントライブラリとコンポーネントを使用できMaterialButtonます。および属性を
使用します。app:iconapp:iconGravity="start"

何かのようなもの:

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

ここに画像の説明を入力してください


アプリのマテリアルデザインテーマがある場合、標準のボタンウィジェットはMaterialButtonとして自動的に拡張されることに注意してください。ここパー- material.io/develop/android/components/buttons
dodgy_coder

1

オーバーライドせずにandroid.widget.Buttonを使用している場合、@ LiemVoの答えは正しいです。MaterialComponentsを使用してテーマをオーバーライドしている場合、これでは問題は解決しません。

だからあなたが

  1. com.google.android.material.button.MaterialButtonまたは
  2. MaterialComponentsを使用してAppThemeをオーバーライドする

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" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.