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

Чтобы добавить Button и обработчик: вставьте Button в layout с уникальным id, задайте constraints (для ConstraintLayout), а в Activity получите ссылку через ViewBinding или findViewById и вызовите setOnClickListener — пример ниже работает без ошибок.

Добавление Button в layout

  1. Откройте res/layout/activity_main.xml.
  2. Вставьте Button в ConstraintLayout (рекомендуется) или RelativeLayout.

Пример для ConstraintLayout:

<Button
    android:id="@+id/myButton"
    android:layout_width="200dp"
    android:layout_height="60dp"
    android:text="Клик!"
    android:textSize="18sp"
    android:textColor="#FFFFFF"
    android:backgroundTint="#2196F3"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toBottomOf="parent" />

Всегда задавайте constraints в ConstraintLayout — иначе элемент "плавает" в редакторе.

Если используете RelativeLayout, примените атрибуты вроде android:layout_centerInParent="true".

Настройка внешнего вида кнопки

  • Цвета: android:backgroundTint и android:textColor.
  • Размер: android:textSize="18sp", фиксированный размер через dp.
  • Стиль: применяйте Material-стили, например style="@style/Widget.Material3.Button" и в themes.xml используйте родителя Theme.Material3.DayNight.

Для ripple-эффекта на API ниже используйте android:foreground="?attr/selectableItemBackground" или MaterialButton (из Material Components) для нативного риппла.

Обработчик нажатия в Activity (Kotlin)

Рекомендуемый способ — ViewBinding. В build.gradle (Module: app) внутри android:

buildFeatures {
    viewBinding true
}

MainActivity.kt:

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(...), вызов API, анимация и т.п.
        }
    }
}

Альтернатива без ViewBinding:

val myButton = findViewById<Button>(R.id.myButton)
myButton.setOnClickListener { /* ... */ }

После включения viewBinding выполните Rebuild Project — иначе класс ActivityMainBinding не сгенерируется.

Частые ошибки

  • Кнопка не кликается: проверьте, не перекрыт ли View, и что android:clickable="true".
  • ID не найден в Activity: соберите проект (Build > Rebuild Project).
  • Фон не меняется у MaterialButton: используйте backgroundTint, а не background.
  • NullPointerException при findViewById: убедитесь, что setContentView установлен перед вызовом.

FAQ

  • Нужно ли всегда использовать ViewBinding? Рекомендуется для безопасности типов и простоты, особенно в новых проектах.
  • Как сделать кнопку круглой? Создайте shape в drawable с cornerRadius и примените через android:background или используйте MaterialButton с app:cornerRadius.
  • Можно ли назначить обработчик прямо в XML? Да — через android:onClick="onMyButtonClick" в Activity должен быть public метод fun onMyButtonClick(view: View), но этот способ менее явный и требует аккуратности.

Если нужно — добавлю примеры для MaterialButton, кастомной drawable‑кнопки или для Jetpack Compose.