Android studio togglebutton style

ToggleButton (Кнопка-переключатель)

Общая информация

Компонент ToggleButton по своей функциональности похож на флажок (checkbox) или переключатель (radiobutton) — это кнопка, которая может находиться в одном из двух состояний: активна (On) или неактивна (Off). По умолчанию на кнопке написано «Оn», если она активна, и «Off» — если нет. По внешнему виду это обычная кнопка с декоративной полоской в нижней части, которая подсвечивается в включенном состоянии (имитация LED-индикатора).

Находится в разделе Widgets:

Если надписи On/Off для вашей программы не подходят, их можно изменить при помощи свойств Text on (атрибут android:textOn) и Text off (атрибут android:textOff). Поскольку надписи Оn и Off на кнопке-переключателе являются отдельными атрибутами, атрибут android: text не используется, он доступен, так как наследуется от ТextView, но в данном случае без него можно обойтись. В программном коде им соответствуют методы setTextOff() и setTextOn().

По умолчанию, ToggleButton находится в выключенном состоянии, чтобы его «включить», установите свойство checked в значение true. Свойству соответствует метод setChecked(boolean checked).

Основное событие ToggleButton — изменение состояния кнопки onCheckedChanged().

Напишем демонстрационную программу с использованием ToggleButton. Добавим на форму метку, изображение и кнопку-переключатель:

Для создания обработчика события изменения состояния кнопки необходима реализация интерфейса CompoundButton.OnCheckedChangeListener. Интерфейс имеет единственный метод onCheckedChanged(), который необходимо переопределить в нашем классе. При обработке события для определения состояния используется параметр isChecked.

Стилизация

Создайте два изображения для каждого состояния кнопки-переключателя в формате 9-patch, например, btn_toggle_off.9.png и btn_toggle_on.9.png. Разместите картинки в папке res/drawable-hdpi/ (или в других).

Далее создаются два XML-файла в папке res/drawable:

btn_toggle_bg.xml (отвечает за фон):

btn_toggle.xml (выводит нужное изображение в разных состояниях)

Также можно определить стиль и тему для кнопки. В файле res/values/themes.xml пропишите:

Сообщите системе, что нужно использовать новый стиль для кнопки:

Источник

Тайны кнопок в Android. Часть 2: Рефакторинг верстки

Приветствую, уважаемое сообщество.

В предыдущей статье мы, используя только верстку, сделали кнопку “включить/выключить”, и вот что у нас тогда получилось:

XML-код получился довольно увесистый. В этой статье я покажу, как сделать его по-настоящему красивым. Мы сократим код вдвое, убрав все, что может затруднить сопровождение нашего приложения или вызвать недовольство тим-лида. В этой статье мы будем использовать строковые ресурсы ( strings.xml ), ресурсы размерностей ( dimens.xml ), стили и темы ( styles.xml ). Если вы не знакомы с первой частью статьи, рекомендую хотя бы пробежать ее глазами.

Выглядит наша кнопка вот так:

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

Текстовые ресурсы strings.xml

Займемся рефакторингом кода. Там точно есть недостатки, например слово Телефония . Чтобы приложение можно было перевести на несколько языков, все текстовые константы должны быть собраны в файле strings.xml . Он уже создан и находится в каталоге res/values . Откроем его и заменим его содержимое на следующее:

Так мы объявили текстовую константу act_main_telephony . Теперь заменим текст кнопки android:textOn и android:textOff на ссылку @string/act_main_telephony :

Немного лучше, хотя объем кода от этого только вырос, но это плата за возможность удобной локализации приложения. Как именно его можно локализовать? Наш файл strings.xml размещен в каталоге res/values . Сейчас мы пишем в него русскоязычный текст. Допустим, мы хотим поддерживать еще и английский язык. Для этого мы создаем каталог res/values-en , и в нем создаем еще один файл strings.xml . Он должен содержать все те же константы, что и первый файл, но уже на английском. При запуске приложения Android ищет в приложении в первую очередь ту локаль, которая установлена у пользователя в системе по умолчанию. Если в приложении нет ресурсов для этой локали, то Android берет ресурсы из локали по умолчанию, то есть из каталога res/values без суффиксов. Там может быть текст на любом языке, не обязательно русском или английском. Этот ресурс будет использован, если пользователю не подходит любой другой имеющийся в приложении ресурс. Локализовать можно не только ресурсы values , но и любые другие, например часто локализуют drawable , если какой-то текст задан картинкой. Если вас интересуют подробности, рекомендую почитать интересную статью о локализации приложений от Google и о том, как Android выбирает наиболее подходящий ресурс. Если будет время, я постараюсь подготовить отдельную статью о локализации с примерами, так как этот вопрос достаточно обширный.

Стили и темы: styles.xml

Что делать, если нам нужно десять таких кнопок, отличающихся только надписью и левой иконкой? Копировать все? Тогда размер файла макета будет непомерно большой и содержать 80% повторяющегося кода. Здесь нам на помощь приходят стили. Давайте вынесем в стили все, что только может повторяться. К счастью, плагин ADT для Eclipse несколько облегчает процесс, если вы не очень знакомы с разработкой файлов стиля Android.

Читайте также:  Звуками оружия для андроид

Для извлечения стиля откроем наш макет activity_main.xml в режиме Graphical Layout и выделим кнопку. Щелкнем на ней правой кнопкой мыши и выберем пункт Extract Style :

Укажем имя стиля: styleOnOffButton и оставим отмеченными все атрибуты, кроме android:drawableLeft , android:textOn и android:textOff , которые будут отличаться у каждой кнопки в нашем приложении. Остальные атрибуты будут вынесены в стиль:

Нажмите ОК. Полученный стиль можно увидеть в файле res/values/styles.xml :

А текст кнопки сильно уменьшился:

Теперь, чтобы сделать десять кнопок, нужно писать куда меньше текста, и минимум дублирования кода. Обратите внимание: атрибуты android:layout_width и android:layout_height в стиль не выносятся. Они обязательно должны присутствовать у каждого элемента в файле макета. Атрибут android:id , конечно же, свой у каждого объекта, поэтому тоже не выносится в стиль. Тем не менее, полученный код достаточно компактен, чтобы его было удобно переиспользовать.

Если вы сейчас запустите приложение, то увидите, что все “поплыло”, и результат совсем не тот, что мы ожидали. Почему? Потому что стиль хоть и создался, но к кнопке не применился.

Применить стиль к кнопке, можно, указав ей атрибут style=»@style/styleOnOffButton» . Это было бы сделано автоматически, если бы мы включили опцию Set style attribute on extracted elements при извлечении стиля. Оба пути сработают, но это не лучшие варианты, так как эту строку нужно будет прописывать каждому экземпляру кнопки в каждом окне. Хотелось бы этого избежать. Как правило, в приложениях используется один стиль для одинаковых элементов управления, это одно из базовых правило дизайна. То ессть все кнопки типа включить/выключить выглядят одинаково, отличаясь только иконками и текстом. Редко кто делает одну прямоугольную, другую кругленькую, а третью ромбиком.

Это дает нам возможность прописать стиль в теме. Откройте файл styles.xml и найдите там следующий текст:

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

Что такое android:buttonStyleToggle , что еще можно стилизовать, и где об этом почитать? Я так и не смог найти полноценную документацию по стилям. Если кто-то ее видел, пожалуйста напишите в комментариях. Поэтому я обращаюсь напрямую к исходникам Android, к счастью они открыты для всех. Я работаю с ADT, и у меня исходники стилей Android лежат здесь: adt-bundle-windows\sdk\platforms\android- \data\res\values\themes.xml . Скачиваются исходники при помощи утилиты Android SDK Manager, которая запускается прямо из Eclipse, меню Window->Android SDK Manager .

И еще одно исправление мы должны сделать. Созданный нами стиль не наследуется от стиля кнопок, а это значит, что наш элемент управления потерял способность нажиматься. Это легко проверить, если сейчас запустить приложение и попробовать нажать кнопку. Как это вылечить? Нужно наследовать наш стиль от стиля android:style/Widget.Button.Toggle — это стиль всех ToggleButton по умолчанию:

Откуда я взял android:style/Widget.Button.Toggle ? Из тех же исходников Android, файл styles.xml .

Ресурсы размерностей: dimens.xml

Теперь все работает, как надо. Но мы должны сделать еще пару небольших улучшений. Как вы заметили, в стиле styleOnOffButton есть атрибут android:textSize , который задан константой 24sp . Если в нашем приложении будет еще какой-то текст, кроме кнопок, вероятно мы захотим его сделать таким же по размеру для сохранения общего стиля. А это значит, что константу 24sp мы будем еще не раз использовать в разных местах. И если мы потом захотим поэкспериментировать с размером текста, то нам придется менять эти константы по всему приложению. Чтобы этого избежать, давайте объявим именованную константу размера. Откроем файл res/values/dimens.xml и заменим все его содержимое следующим:

Как видите, кроме text_size здесь есть еще одна константа — activity_padding . Если вспомнить код нашего макета, то там мы увидим константу android:padding=»6dp» в теге RelativeLayout . А так как отступы от границ экрана у всех окон приложения также логично делать одинаковыми, это значение само-собой напрашивается в константы.

Теперь заменим константу 24sp в стиле на новый ресурс @dimen/text_size :

И текст тега RelativeLayout в файле activity_main.xml с константой в ресурсах:

И еще немного о стилях

Давайте еще раз подумаем о стилях. Мы сделали одинаковый стиль для всех ToggleButton , так почему бы не сделать стиль для всех окон? Тем более, что кроме отступов от границ у всех окон будет общий цвет фона. Такой стиль будет простой, нам не нужно его ни от чего наследовать, давайте пропишем его вручную. Откроем файл styles.xml и добавим в конец перед закрывающим тегом следующий код:

Читайте также:  Application class android kotlin

Вот еще один способ задавать цвет — в файле ресурсов с помощью тега color .

Не каждый RelativeLayout — главный элемент Activity, поэтому мы не можем прописать стиль всем RelativeLayout , как мы поступили с ToggleButton . В этом случае стиль нужно указывать явно в тех элементах, где это нужно, используя атрибут style . Давайте пропишем стиль нашему макету и посмотрим, что в и тоге у нас получилось:

Все атрибуты окон у нас в стилях. Для каждой новой Activity достаточно указать стиль style=»@style/styleActivity» ее корневому элементу, и окно будет выглядеть так же, как и другие окна приложения.

Заключение

Сравните исходный вариант макета с оптимизированным. Вот, что у нас было:

И вот, что получилось:

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

Все числовые константы спрятаны в файле dimens.xml , никакого копипаста одних и тех же констант у нас не будет. Все строковые константы — в файле strings.xml . Для локализации приложения под другие языки достаточно перевести только этот файл.

Разница между исходным и оптимизированным вариантом заметна даже на одном элементе окна. В реальных приложениях их в окне десятки, а потому оптимизированный код будет на порядок проще читать и сопровождать. Мое самое большое приложение iPUMB — ПУМБ online содержит около 40 activity. Если бы не стили, мне пришлось бы копировать оформление окон по 40 раз, и если дизайнеры придумают что-то новое, мне пришлось бы 40 раз этот код менять.

Еще одна прелесть стилей — это унификация кода при командной разработке. Один раз написанный файл стиля дал всем членам нашей команды разработчиков готовый инструмент для верстки окон, и все наши окна выглядели, как единое целое, и без каких-либо рефакторингов и «подгонок».

Буду рад, если эта статья оказалась вам полезна. В следующих статьях я обязательно поделюсь другими тонкостями верстки в Android.

Источник

Android Toggle Buttons

In the previous lessons, we added RadioButtons and CheckBoxes to a layout, and wrote the code to get them working. Another widget we can add to your apps is the Toggle button. This lets you have an on/off state. What we’ll do is to add one to our layout for Terms and Conditions. If the Toggle button is off then the user doesn’t agree with the Terms and Conditions. If the button is on, then they do agree with them. Let’s see how they work. We’ll also explore listeners.

In earlier versions of Android Studio, click on the Widgets category in your palette. Locate the ToggleButton item:

In later versions, the ToggleButton is in the Buttons category:

Drag one on to your layout and position it under the checkboxes. Add constraints to the top of the toggle button to the bottom of the third checkbox. You can also add constraints to the left end right edges of the screen, and the bottom of the screen. Your layout should look something like this:

With the toggle button selected, have a look at the ID property on the right. It has a default ID of toggleButton. Change this to termsToggle:

In later versions of Android Studio, expand the Lalyout item to see the constraints section:

Now open up your MainActivity.java file.

Previously, we set up methods to handle our button presses. We then pointed to the methods using the properties area. Another way to handle button presses and clicks is to set up something called a Listener. As the name suggests, these Listeners listen out for any button presses or clicks. They then call a method that activates your code. When you set up a Listener, you don’t need to use the properties area to point to a method. A Listener is always alert and ready for action!

Listeners are usually set up in the onCreate method of your app. This way, they are initialised when the app starts up. This contrasts with the methods we set up before, where the method has to be initialised and called when a button is pressed or clicked.

In the onCreate method of your code, then, add the following line:

final ToggleButton myToggle = (ToggleButton) findViewById(R.id.termsToggle);

(If you get any red text, press ALT + Enter to add the android library for a ToggleButton. Or simply type import android.widget.ToggleButtton; to the top of your code.)

Читайте также:  Мой город для android

The line of code just sets up a ToggleButton with the variable name of myToggle. We use findViewById to reference the toggle button on the layout.

To set up the listener, you start with this rather complicated code:

myToggle.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() <

Note where all the curly brackets and round brackets are. It’s very easy to get these wrong! At the end, you need a curly bracket, a round bracket, and a semicolon.

You’re not done setting up the listener yet, though. Add this method inside of the listener. It should get rid of any red lines you have:

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) <

The whole thing should look like this:

If you’re missing any import statements at the top for this project, you should have these (the ones in bold are new for this tutorial):

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.ToggleButton;

The actual code for the listener is fairly simply. It’s this:

TextView myText = (TextView) findViewById(R.id.displayArea);

myText.setText(«I agree with the Terms and Conditions»);

myText.setText(«I do NOT agree with the Terms and Conditions»);

Again, we get a reference to our TextView called displayArea. Then we have an IF statement. The IF statement examines a boolean variable called isChecked. If this is true then we set some text; if it’s false then we set some other text. But where is this Boolean variable isChecked coming from? Well, have a look at the method inside of the listener:

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) <

The onCheckedChanged method accepts a Boolean variable as one of its parameters. It’s this Boolean variable, isChecked, that is used in our code.

Add the if statement to your own code and your onCreate method will look like this (the highlighted text is because we didn’t set up a string resource, but simply entered text directly):

Test out your app. When you run it on the Emulator or a real phone hit your toggle button. You should see this:

Hit the toggle button again and you’ll see this:

So we’re toggling from ON to OFF, with a different message being displayed, depending on which state the toggle button is in.

That text on the toggle button that says ON and OFF can be changed to something of your choosing. Stop the app from running. In Android Studio, click back on the activity_main.xml file. Make sure you are in Design view and not Text view for the layout. With your toggle button selected, look at the properties area on the right. Locate the textOff and textOn properties. Here they are in earlier versions of Android Studio:

In later versions, you need to expand the Common Attributes section:

Change these to anything you like (again, we’re entering direct text rather than setting up a string resource):

Now run your app again. You should see this for the toggle button off state when the app first loads:

And this for the ON state:

You can even set these values with code, if you want to. Like this:

final ToggleButton myToggle = (ToggleButton) findViewById(R.id.termsToggle);

The two method to use are setTextOn and setTextOff.

ToggleButton styles

If you don’t like the style of your toggle button, you can choose one of the other presets quite easily. In Design Layout view, click on your toggle button to select it. In the properties area on the right, locate the style property and click the button to the right of the textbox:

Clicking the button brings up the Resources dialogue box. Type toggle in the search box at the top to see the following styles you can apply:

Select one of the styles under the Android heading. In the image below, we’ve gone for Widget.Button.Toggle:

When the app is run, the toggle button will look like this in the ON state:

Try some of the other styles, though, to see what they look like.

In the next lesson, you’ll learn about the Android SeekBar. A SeekBar is one of those sliders you use to change the brightness or volume on your phone/tablet.

Источник

Оцените статью