Пользовательский размер кнопки переключения Android / отступы / интервалы

Я пытаюсь создать собственный стиль для кнопок переключения Android. С изменением цвета и текста проблем не возникло, но у меня возникли проблемы с изменением размера / заполнения / интервала или чего-то еще, что по умолчанию позволяет им казаться такими излишне большими. Я установил высоту wrap_content и padding и margin на 0, но размер кнопки по-прежнему такой же, как у кнопки переключения по умолчанию.

Кто-нибудь из вас знает, какие параметры мне нужно изменить, чтобы убрать ненужный интервал между текстом кнопки и рамкой?

Вот ссылка на изображение того, чего я хочу достичь. Слева направо: ToggleButton по умолчанию, мой текущий ToggleButton и тип ToggleButton, который я хочу.

Вот мой код (поскольку я добавляю эти кнопки динамически, без xml)

ToggleButton button = new ToggleButton(getContext());
button.setLayoutParams(new LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
button.setId(IDCreator.getID());
button.setText(tag);
button.setTextOff(tag);
button.setTextOn(tag);
button.setGravity(Gravity.LEFT);
button.setPadding(0, 0, 0, 0);
button.setBackground(getContext().getResources().getDrawable(R.drawable.toggle_selector));

Спасибо за вашу помощь. С уважением.

Изменить: изображение и код


person Androidicus    schedule 20.08.2014    source источник
comment
Вы всегда можете разместить ссылку на свое изображение (ссылка без рекламы).   -  person jyoonPro    schedule 20.08.2014
comment
Фактически не видя макета, довольно сложно понять, в чем проблема. Попробуйте добавить изображение по ссылке, и я буду рядом, чтобы решить эту проблему.   -  person Maverick    schedule 20.08.2014
comment
Размер кнопки переключения android является стандартным, но может быть размер ваших изображений (нестандартный) не так хорош, как должен быть. Поэтому, пожалуйста, еще раз проверьте размер изображений.   -  person Yogendra    schedule 20.08.2014
comment
@ 23imak Привет, я загрузил изображение и образец кода.   -  person Androidicus    schedule 20.08.2014
comment
Привет, @Androidicus, я столкнулся с той же проблемой, я не могу избавиться от заполнения текста в ToggleButton. Удалось ли тебе когда-нибудь это решить?   -  person trethaller    schedule 23.04.2015
comment
android: minWidth = 0dp и android: minHeight = 0dp, как показано stackoverflow.com/questions/29911613/ Я не смог исправить это программно ...   -  person kouretinho    schedule 09.07.2015


Ответы (5)


Если вы просто пытаетесь изменить способ отображения текста внутри ToggleButton, вам необходимо настроить параметры android:padding и android:gravity в XML для вашей кнопки.

Чтобы изменить отступы, вам сначала нужно убрать текст из центра по умолчанию (потому что, когда он центрирован, отступы не могут вступить в силу). Вы делаете это с помощью параметра android:gravity, который похож на выравнивание текста в CSS.

Например;

<ToggleButton xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left">
</ToggleButton>

Это выровняет текст слева от ToggleButton. Однако по умолчанию это также выровняет его по верхнему краю, поскольку гравитация влияет как на оси x, так и на оси y.

Если вы хотите выровнять по центру по вертикали и влево по горизонтали, вы должны сделать следующее:

<ToggleButton xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left|center">
</ToggleButton>

Это даст вам его центрированное по вертикали, но полностью левое по горизонтальной шкале. Это заставит текст располагаться поверх края кнопки и выглядеть непривлекательно. Вам необходимо использовать выравнивание вместе с отступом для текста, чтобы получить его именно там, где вы хотите.

Например:

<ToggleButton xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding_left="10dp"
android:gravity="left|center">
</ToggleButton>

Это добавляет отступ только слева, что означает, что вы можете установить его как можно дальше от границы.

Вы можете поиграть с отступом для каждой стороны и силой тяжести, чтобы масштабировать текст в соответствии с вашими потребностями, но это был бы лучший подход для управления внутренним выравниванием текста ToggleButton.

person Steven Toews    schedule 20.08.2014
comment
Спасибо за подробный ответ. К сожалению, это не помогло. Текст изменил положение внутри кнопки, но размер кнопки не изменился. См. Мой обновленный вопрос для примера кода. - person Androidicus; 20.08.2014
comment
Вы пытаетесь создать класс для кнопки, который меньше, чем собственный ToggleButton, который можно использовать несколько раз, динамически регулируя размер на основе его текста? Или это для одной статической кнопки? Если да, вы можете просто указать ширину и высоту, а затем настроить отступ и гравитацию по своему вкусу? - person Steven Toews; 21.08.2014

Это даст вам ширину строки, т.е. текст в вашем случае.

Paint paint = toggleButton.getPaint();
float length = paint.measureText(YOUR_STRING);

Это дает вам ширину строки, которую он займет на экране. Теперь установите ширину переключателя с помощью LayoutParams.

Допустим, родительский макет вашего переключателя - LinearLayout. так что это должно выглядеть так:

toggleButton.setLayoutParams(new LayoutParams(WIDTH_YOU_CALCULATED,LinearLayout.LayoutParams.WRAP_CONTENT));         

Это установит ширину и высоту вашего ToggleButton на то, что вы рассчитали.

person Maverick    schedule 20.08.2014
comment
Спасибо, но это тоже не работает. По-прежнему кажется, что вокруг текста много отступов, потому что, если я изменяю размер кнопки, текст исчезает. (Я бы хотел изменить высоту, а не ширину кнопки) - person Androidicus; 20.08.2014

Я понимаю, что это устарело, но, возможно, использование setScaleX ({укажите float 0,0–1,0}) и setScaleY ({укажите float 0,0–1,0}) может быть ответом для исходного сообщения (как изменить размер кнопки переключения ).

person rvs    schedule 06.02.2017

Вместо этого используйте CheckedTextView: https://stackoverflow.com/a/36084999/377320 Это просто обычный TextView с отмеченным состоянием , так что никаких странных прокладок и т. д.

person Martin Vysny    schedule 18.03.2016

Вам нужно определить свой ToggleButton в XML-файле и убедиться, что вы включили

 android:minHeight="0dp"
 android:minWidth="0dp"

как атрибуты. У меня была точно такая же проблема, и я почти отказался от использования ToggleButton по этой причине. Вызов setMinWidth (int) и setMinHeight (int) в моем коде не повлиял на меня, как и все, что я пробовал. Но когда я установил эти атрибуты в xml, я смог контролировать размер ToggleButton с заполнением, хотя имейте в виду, что я также изменил заполнение с помощью xml, например:

android:paddingTop="6dp"
android:paddingBottom="6dp"

У вас может быть возможность установить отступы программно, если вы установите minWidth и minHeight в xml. Кстати, определение ваших виджетов в xml очень просто. Большинство людей делают это с помощью View.inflate () или myinflater.inflate (), поэтому погуглите эти термины, и вы найдете примеры.

person Alyoshak    schedule 26.09.2018