Кнопки в Android: практический гид

Чтобы создать кнопку в Android — используйте MaterialButton в XML или Button/OutlinedButton в Jetpack Compose, подключив библиотеку Material Components; обработку кликов делайте через setOnClickListener (или onClick в Compose), а стили задавайте через themes/styles и атрибуты app:backgroundTint, app:cornerRadius и т.д.

Быстрое добавление: MaterialButton в XML

  1. В build.gradle (Module: app) добавьте:
implementation 'com.google.android.material:material:1.12.0'
  1. Пример простой кнопки в 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, комбинируйте стили и проверяйте доступность — так вы получите современные и удобные кнопки на большинстве устройств.