Кнопка 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 у мене не працює (можливо, так і було б, але я не знаю, як встановити максимальну висоту піктограми).

Тож я створив LinearLayout з ImageView та TextView і змусив його діяти як кнопка:

    <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, так що "нова кнопка" йде першою, це робить ще один дивний результат:

введіть тут опис зображення

Тепер я помітив, що коли я намагаюся натиснути стару кнопку, натискається нова.

Будь-які ідеї?

Відповіді:


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. Мої значки мають більший розмір. Це означає, що мені потрібно створювати менші растрові зображення для кожної роздільної здатності? Чи є якийсь параметр, який дозволяє мені контролювати розмір піктограми?
Душан

Це правильно. Вам потрібно створити різний розмір зображення для кожної роздільної здатності
Liem Vo

Добре, дякую за допомогу, але зараз у мене є ще одне запитання ... Мої значки світлі, оскільки текст білий на темній кнопці, як ви можете бачити на зображеннях у моєму запитанні. Додаток налаштовано на використання теми, яка доступна у версії для Android. Мої приклади з android 4.3. Коли програма працює на Android 2.3.3, кнопки за замовчуванням світлі з темним текстом. Начебто щось на кшталт кнопки на моєму першому зображенні. Чи є спосіб надати альтернативне растрове зображення для піктограми, що працює на старих пристроях. Сподіваюся, ви зрозуміли моє запитання :)
Душан,

Це хороше питання. Ви можете визначити різний стиль для вашої піктограми, кулер тексту в стилі для кожного рівня API (це означає версію ОС Android). Ви можете побачити папки values-v11, values-v14.
Liem Vo

2
Ви також можете додати відступ до значка android: drawablePadding = ""
Asad Mirza

15

Щоб додати зображення ліворуч, праворуч, зверху або знизу, ви можете використовувати такі атрибути:

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

Зразок коду наведено вище. Ви також можете досягти цього, використовуючи відносний макет.


Як мені це робити програмно
Суджай ООН,

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 не відображається на інтерфейсі користувача. Замість цього використано setCompoundDrawablesWithIntrinsicBounds, і це спрацювало.
Aldo

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:iconіapp:iconGravity="start" атрибути .

Щось на зразок:

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

введіть тут опис зображення


Зверніть увагу, що якщо у вас є тема дизайну матеріалу для вашого додатка, стандартний віджет Button автоматично надувається як MaterialButton. Тут - material.io/develop/android/components/buttons
dodgy_coder

1

Відповідь @Liem Vo правильна, якщо ви використовуєте android.widget.Button без жодних змін. Якщо ви перевизначаєте свою тему за допомогою MaterialComponents, це не вирішить проблему.

Тож якщо ти

  1. Використовуючи com.google.android.material.button.MaterialButton або
  2. Заміна AppTheme за допомогою MaterialComponents

Використовуйте параметр 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" />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.