Android:как создать кнопку с изображением и текстом, расположенными по центру

Я застрял в странной проблеме с Android -Я хочу, чтобы кнопка выглядела так:

 |-----------------------------------------------------------------------|
 |                   [icon] <5px> [text text text]                       |
 |-----------------------------------------------------------------------|

и группа ([icon] [text текст text])должен располагаться по центру. Обратите внимание, что 5px используется только в качестве заполнителя для любого отступа, который вы хотите иметь между значком и текстом

. Я нашел здесь несколько ответов, которые более или менее тяготеют к настройке фона (, чего я не хочу. сделать, потому что у меня есть другой фон)или использование свойства android:drawableLeft для установки значка.

Однако похоже, что документация метода setCompoundDrawablesWithIntrinsicBounds немного вводит в заблуждение(см. здесь). В нем говорится, что изображение размещено слева/справа/сверху/снизу от ТЕКСТА, что неверно. Значок размещается на соответствующей стороне КНОПКИ. Например,:

Установка свойства android:drawableLeft помещает значок в крайнее левое положение и дает мне это (с гравитацией в ЦЕНТРЕ):

 |-----------------------------------------------------------------------|
 | [icon]                     [text text text]                           |
 |-----------------------------------------------------------------------|

или это (с гравитацией ВЛЕВО):

 |-----------------------------------------------------------------------|
 | [icon] [text text text]                                               |
 |-----------------------------------------------------------------------|

Оба чертовски уродливы:(

Я нашел обходной путь, который выглядит следующим образом:

public static void applyTextOffset(Button button, int buttonWidth) {
    int textWidth = (int) button.getPaint().measureText(button.getText().toString());
    int padding = (buttonWidth / 2) - ((textWidth / 2) + Constants.ICON_WIDTH  + Constants.ICON_TO_TEXT_PADDING);
    button.setPadding(padding, 0, 0, 0);
    button.setCompoundDrawablePadding(-padding);
}

И он работает более или менее, но мне он не нравится по следующим причинам:

  • он требует знания ширины кнопки. С кнопками автоматического-размера это не будет известно, пока не будет сделана фактическая компоновка. Google рекомендует использовать прослушиватель, чтобы узнать фактическую ширину после завершения рендеринга, но это очень усложняет код.
  • Мне кажется, что я беру на себя ответственность за компоновку от механизма компоновки Android

Нет ли более элегантного решения?

6
задан vap78 2 April 2012 в 18:21
поделиться