Кнопки в Android: практический гид
Чтобы создать кнопку в Android — используйте MaterialButton в XML или Button/OutlinedButton в Jetpack Compose, подключив библиотеку Material Components; обработку кликов делайте через setOnClickListener (или onClick в Compose), а стили задавайте через themes/styles и атрибуты app:backgroundTint, app:cornerRadius и т.д.
Быстрое добавление: MaterialButton в XML
- В build.gradle (Module: app) добавьте:
implementation 'com.google.android.material:material:1.12.0'
- Пример простой кнопки в layout:
<com.google.android.material.button.MaterialButton
android:id="@+id/myButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Нажми меня"
app:icon="@drawable/ic_play" />
MaterialButton поддерживает ripple, elevation, иконки и скругления по умолчанию. Размещайте в ConstraintLayout/LinearLayout для удобного позиционирования.
Для декларативного UI используйте Jetpack Compose: Button и OutlinedButton проще в интерактивности и тестировании.
Обработка onClick в Activity/Fragment (Kotlin)
Рекомендуется ViewBinding или Kotlin synthetic-free код.
С ViewBinding в Activity:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.myButton.setOnClickListener {
Toast.makeText(this, "Кнопка нажата!", Toast.LENGTH_SHORT).show()
// Пример: startActivity(Intent(this, SecondActivity::class.java))
}
}
}
С findViewById:
findViewById<MaterialButton>(R.id.myButton).setOnClickListener {
// логика
}
Для множества кнопок — общий listener:
val buttons = listOf(btnOk, btnCancel, btnRetry)
buttons.forEach { b -> b.setOnClickListener { v ->
when (v.id) {
R.id.btnCancel -> finish()
R.id.btnRetry -> loadData()
}
} }
Для Compose:
Button(onClick = { /* действие */ }) {
Text("Кнопка")
}
Стилизация и Material 3 — практические атрибуты
Основные атрибуты для MaterialButton:
- app:backgroundTint — цвет фона
- android:textColor — цвет текста (часто ?attr/colorOnPrimary)
- app:cornerRadius — радиус углов
- app:icon, app:iconTint, app:iconSize
- app:elevation, app:strokeWidth, app:strokeColor
Пример тонкой (outlined) кнопки:
<com.google.android.material.button.MaterialButton
style="@style/Widget.Material3.Button.OutlinedButton"
app:strokeWidth="1dp"
app:strokeColor="?attr/colorPrimary"
app:icon="@drawable/ic_search"
android:text="Поиск"
app:iconSize="20dp" />
Кастомный стиль в styles.xml:
<style name="CustomButton" parent="Widget.Material3.Button">
<item name="android:textSize">16sp</item>
<item name="app:cornerRadius">16dp</item>
<item name="app:elevation">4dp</item>
</style>
Применение:
style="@style/CustomButton"
Не используйте android:background для MaterialButton — это ломает встроенные анимации и ripple. Меняйте background через backgroundTint.
Material Components: FAB, Tonal, Extended FAB
- FloatingActionButton для главного действия:
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:src="@drawable/ic_add" />
Анимация:
fab.setOnClickListener { fab.animate().rotationBy(360f).setDuration(300).start() }
- Tonal и Extended FAB доступны через стили/компоненты Material3; в Compose — ExtendedFloatingActionButton.
Доступность, производительность и тестирование
- Accessibility: задавайте android:contentDescription для иконок и кнопок, используйте focusable и правильные role/aria-эквиваленты.
- Производительность: в RecyclerView используйте DiffUtil; не создавайте лишние лямбды внутри onBindViewHolder без реюза.
- Поддержка: тестируйте на API 21+ и в light/dark темах.
Частые ошибки
- Использование android:background вместо backgroundTint — ломает Material анимации.
- Забыть contentDescription — плохая доступность.
- Создание heavy-операций в onClick (выполняйте в фоновом потоке).
- Привязка view без очистки в фрагментах — утечки памяти (освобождайте binding в onDestroyView).
FAQ
- Как добавить иконку слева? — Используйте app:icon и app:iconSize в MaterialButton.
- Как сделать круглую кнопку? — Для FAB используйте FloatingActionButton; для MaterialButton задайте cornerRadius равный половине высоты.
- Можно ли стилизовать кнопку через тему? — Да, определяйте стили в themes.xml и применяйте через parent-виджеты Material3.
Экспериментируйте с preview в Android Studio, комбинируйте стили и проверяйте доступность — так вы получите современные и удобные кнопки на большинстве устройств.