Android アプリである項目を選択する場合には CheckBox を使います。CheckBox はチェックされた状態とチックされていない状態のいずれかを取りますが、Kotlinでの作り方を確認してみましょう。
2024.1.1
CheckBox
CheckBoxはボタンなどと同じようにリスナーをセット。これにより、タップされるたびにステータスが変化します。
また、複数のCheckBoxを使うことを想定して、Arrayを使ってCheckBoxを2つ作ってみます。
なお、Javaのケースではこのようにします↓
シンプルなCheckBox
最初に、レイアウトファイルにCheckBoxを1つ置きます。
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <CheckBox android:id="@+id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.1" /> </androidx.constraintlayout.widget.ConstraintLayout> |
CheckBoxのidから、ViewBinding を使ってコードと関連させていきます。
MainActivity.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
//package com.example.kotlincheckbox import android.os.Bundle import android.view.View import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import com.example.kotlincheckbox.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } val status = arrayOf( "未チェックです", "チェックされた", "チェックされてない") binding.checkbox.isChecked = false binding.checkbox.text = status[0] // set the listener upon the checkbox binding.checkbox.setOnClickListener( View.OnClickListener { val check = binding.checkbox.isChecked() if (check) { binding.checkbox.text = status[1] } else { binding.checkbox.text = status[2] } }) } } |
build.gradle
1 2 3 4 5 6 7 8 |
... android { ... buildFeatures { viewBinding = true } } ... |
ステータスは、チェックボックスにチェックが入ることでユーザーにわかりますが、プログラム的には isChecked() で取り出せます。
また、CheckBox としてのテキストも表示できます。
コードで複数のCheckBox作成
おそらく、CheckBoxを単体で使うよりも複数のアンケートでチェックを入れるような用途が多いのではないでしょうか。
複数のCheckBoxを設定するとなると、静的なレイアウトよりもコードで記述したほうが使い回しが効きます。
(ここでは2つですが、10個のCheckBoxのレイアウトは扱いが面倒になります)
MainActivity.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
//package com.example.kotlincheckbox import android.os.Bundle import android.util.TypedValue import android.view.Gravity import android.widget.CheckBox import android.widget.LinearLayout import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import com.example.kotlincheckbox.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } // Array of CheckBox val checkBox = arrayOfNulls<CheckBox>(2) val context = applicationContext val status = arrayOf( "未チェックです", "チェックされた", "チェックされてない") val machParent = LinearLayout.LayoutParams.MATCH_PARENT val layout = LinearLayout(context) layout.orientation = LinearLayout.VERTICAL layout.layoutParams = LinearLayout.LayoutParams( machParent, machParent) // 背景色 //layout.setBackgroundColor(Color.parseColor("#ddffee")) layout.gravity = Gravity.CENTER_VERTICAL setContentView(layout) // CheckBox 1, 2 for(args in checkBox) { val cbox = CheckBox(context) cbox.isChecked = false cbox.text = status[0] cbox.setOnClickListener { // to get status val check = cbox.isChecked if (check) { cbox.text = status[1] } else { cbox.text = status[2] } } // dp unit val scale = resources.displayMetrics.density.toInt() val margins = 20 * scale val wrapContent = LinearLayout.LayoutParams.WRAP_CONTENT val checBoxLayout = LinearLayout.LayoutParams( wrapContent, wrapContent ) checBoxLayout.setMargins(margins * 2, margins, margins, margins); cbox.layoutParams = checBoxLayout cbox.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f) layout.addView(cbox) } } } |
CheckBoxのArrayを使い、for文で回して量産する形です。
コードで書いているので activity_main.xml はいりません。
サンプル動画
どうでしょう、できましたでしょうか?
Reference:
Checkboxes | Android Developers