Я хочу иметь кнопку Android со значком + текстом по центру внутри нее. Я использую атрибут drawableLeft для установки изображения, это хорошо работает, если кнопка имеет ширину, "wrap_content"
но мне нужно растянуть до максимальной ширины, поэтому я использую ширину "fill_parent"
. Это перемещает мой значок прямо влево от кнопки, и я хочу, чтобы и значок, и текст располагались по центру внутри кнопки.
Я пытался настроить отступы, но это позволяет указать только фиксированное значение, поэтому мне это не нужно. Мне нужно, чтобы значок + текст был выровнен по центру.
<Button
android:id="@+id/startTelemoteButton"
android:text="@string/start_telemote"
android:drawableLeft="@drawable/start"
android:paddingLeft="20dip"
android:paddingRight="20dip"
android:width="fill_parent"
android:heigh="wrap_content" />
Есть предложения о том, как я могу этого добиться?
android
android-layout
user-interface
button
alignment
jloriente
источник
источник
Ответы:
android: drawableLeft всегда сохраняет android: paddingLeft как расстояние от левой границы. Если для кнопки не задано значение android: width = "wrap_content", она всегда будет висеть слева!
В Android 4.0 (уровень API 14) вы можете использовать атрибут android: drawableStart, чтобы поместить объект для рисования в начало текста. Единственное решение с обратной совместимостью, которое я придумал, - это использование ImageSpan для создания Spannable Text + Image:
В моем случае мне также нужно было настроить атрибут android: gravity кнопки, чтобы он выглядел по центру:
источник
button.setText(buttonLabel)
Я знаю, что опаздываю с ответом на этот вопрос, но мне это помогло:
Я нашел это решение отсюда: проблемы с пользовательским интерфейсом Android: создание кнопки с центрированным текстом и значком
источник
Все предыдущие ответы кажутся устаревшими
Вы можете использовать
MaterialButton
теперь, который позволяет установить гравитацию значка.Очевидно, что для использования компонентов материала вам потребуется:
Добавить зависимость
implementation 'com.google.android.material:material:1.3.0-alpha01'
(использовать последнюю версию)Сделайте вашу тему расширенной темой Material Components
Если вы не можете этого сделать, расширьте его из темы Material Bridge.
источник
Я использовал LinearLayout вместо Button . OnClickListener , что мне нужно использовать хорошо работает и для LinearLayout.
источник
Я настраиваю его, добавляя отступы слева и справа следующим образом:
источник
Недавно я столкнулся с той же проблемой. Пытался найти более дешевое решение, поэтому придумал это.
Тогда просто позвонить
OnClickListener
наLinearLayout
.Надеюсь, это кому-то поможет, так как это кажется очень распространенной проблемой. :)
источник
Вы можете использовать настраиваемую кнопку, которая измеряет и рисует себя, чтобы разместить левую кнопку мыши. Вы можете найти пример и использование здесь
использование
источник
Это мое решение, которое я написал 3 года назад. Кнопка имеет текст и левый значок и находится в рамке, которая является настоящей кнопкой здесь и может быть растянута с помощью fill_parent. Я не могу проверить это снова, но тогда он работал. Вероятно, Button не нужно использовать, и ее можно заменить на TextView, но я не буду тестировать ее прямо сейчас, и здесь она не сильно меняет функциональность.
источник
Я знаю, что этот вопрос немного старше, но, возможно, вы все еще открыты для подсказок или обходных путей:
Создайте RelativeLayout «wrap_content» с изображением кнопки в качестве фона или самой кнопкой в качестве первого элемента макета. Получите LinearLayout и установите для него layout_centerInParent и wrap_content. Затем установите Drawable как Imageview. Наконец, установите TextView с вашим текстом (языковой стандарт).
так что в основном у вас есть эта структура:
или вот так:
Я знаю, что в этом решении есть много элементов, с которыми нужно иметь дело, но с его помощью вы можете очень легко создать свою собственную кнопку, а также установить точное положение текста и чертежей :)
источник
Мой способ решения этой проблемы заключался в окружении кнопки легкими
<View ../>
элементами, размер которых изменяется динамически. Ниже приведены несколько примеров того, чего можно достичь с помощью этого:Обратите внимание, что интерактивная область кнопок в примере 3 такая же, как и в примере 2 (то есть с пробелами), что отличается от примера 4, где между ними нет «неактивных» промежутков.
Код:
источник
Попробуйте использовать эту библиотеку
OmegaCenterIconButton
источник
Вы можете создать собственный виджет:
Класс Java IButton:
}
Макет ibutton.xml
Чтобы использовать этот настраиваемый виджет:
Вы должны предоставить пространство имен для настраиваемых атрибутов xmlns: ibutton = "http://schemas.android.com/apk/res/com.test.android.xxx", где com.test.android.xxx - корневой пакет приложение.
Просто поместите его под xmlns: android = "http://schemas.android.com/apk/res/android".
Последнее, что вам понадобится, это настраиваемые атрибуты в attrs.xml.
В attrs.xml
Для лучшего позиционирования оберните настраиваемую кнопку внутри LinearLayout, если вы хотите избежать потенциальных проблем с позиционированием RelativeLayout.
Наслаждайтесь!
источник
Была аналогичная проблема, но хотелось иметь возможность рисования по центру без текста и без обернутых макетов. Решением было создать настраиваемую кнопку и добавить еще одну возможность рисования в дополнение к LEFT, RIGHT, TOP, BOTTOM. Можно легко изменить место размещения, которое можно рисовать, и расположить его в желаемом положении относительно текста.
CenterDrawableButton.java
attrs.xml
использование
источник
Поместите FrameLayout в LinearLayout и установите ориентацию по горизонтали.
источник
Вы можете поместить кнопку над LinearLayout
источник
Что произойдет, если вы попробуете android: gravity = "center_horizontal"?
источник
Я думаю, что android: gravity = "center" должен работать
источник
Как предположил Роджа, до 4.0 не было прямого способа центрировать текст с возможностью рисования. И действительно, установка значения padding_left действительно перемещает объект рисования от границы. Поэтому я предлагаю, чтобы во время выполнения вы точно вычислили, сколько пикселей от левой границы должно быть у вашего объекта для рисования, а затем передайте его с помощью setPadding. Ваш расчет может быть примерно таким
Ширина вашего рисунка фиксирована, и вы можете посмотреть его, а также вычислить или угадать ширину текста.
Наконец, вам нужно будет умножить значение заполнения на плотность экрана, что вы можете сделать, используя DisplayMetrics.
источник
Я не тестирую, но кажется, что вы можете использовать библиотеку CenteredContentButton
источник
открытый класс DrawableCenterTextView расширяет TextView {
}
источник
Грязное исправление.
Правильное заполнение решает задачу. Однако для различного экрана используйте другое заполнение и поместите его в размерный ресурс в соответствующую папку значений.
источник
Используйте RelativeLayout (контейнер) и android: layout_centerHorizontal = "true" , мой образец:
источник
Другая возможность сохранить тему Button.
С помощью этого решения, если вы добавите @ color / your_color @ color / your_highlight_color в свою тему активности, у вас может быть тема Matherial на Lollipop с тенью и рябью, а для предыдущей версии - плоская кнопка с вашим цветом и цветом при нажатии.
Более того, с помощью этого решения автоизменение размера изображения
Результат: первый на устройстве Lollipop Второй: на устройстве pre lollipop 3-й: кнопка нажатия устройства Pre Lollipop
источник
Я центрировал
textView
с помощью значкаpaddingLeft
и выравнивал textView по левому краю | centerVertical . и для небольшого разрыва между представлением и значком я использовалdrawablePadding
источник
android:paddingLeft
работало.Это может быть старый / закрытый поток, но я поискал везде, не нашел ничего полезного, пока не решил создать свое собственное решение. Если кто-нибудь здесь пытается найти ответ, попробуйте этот, это может сэкономить вам минуту размышлений
Поскольку линейный макет действует как контейнер и тот, у кого есть селектор, когда вы щелкаете весь линейный макет, он будет выглядеть именно так, как он должен быть. если вы хотите, чтобы они были по центру, используйте относительный угол наклона. Если вы хотите, чтобы он был расположен по центру по горизонтали, измените ориентацию на горизонтальную.
Обратите внимание, НЕ забудьте добавить android: clickable = "true" в основной контейнер (относительный или линейный) для выполнения действия.
Опять же, это может быть старая ветка, но все же может кому-то помочь.
-привет, надеюсь, что это поможет- счастливые коды.
источник
Если вы используете одно из решений настраиваемого представления , будьте осторожны, потому что они часто не работают с длинным или многострочным текстом . Я переписал некоторые ответы, заменил
onDraw()
и понял, что это не так.источник
Я видел решения для выравнивания вытягиваемого в начале / влево, но ничего для вытягиваемого конца / вправо, поэтому я придумал это решение. Он использует динамически вычисляемые отступы для выравнивания текста и текста как с левой, так и с правой стороны.
Важно установить гравитацию в макете на «center_vertical | start» или «center_vertical | end» в зависимости от того, где вы устанавливаете значок. Например:
Единственная проблема с этой реализацией заключается в том, что на кнопке может быть только одна строка текста, иначе область текста заполняет кнопку, а отступы будут равны 0.
источник
использовать это
android:background="@drawable/ic_play_arrow_black_24dp"
просто установите фон для значка, который вы хотите центрировать
источник