【Android/Kotlin】ボタンのタップ処理実装

目次

概要

アプリの実装する上で基本中の基本となるボタンをタップした時の処理の実装方法を紹介していく。
とても単純なので是非、習得して欲しい。

以下のサンプルコードはボタンをタップしたら背景色を変えるというものだ。

ソースコード

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.Test"
        tools:targetApi="31">
        <activity android:name=".ButtonActionActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="false">

        </activity>
    </application>

</manifest>

ButtonActionActivity.kt

package com.seeking_star.test

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.MenuItem
import com.seeking_star.test.Enumration.MagicType
import com.seeking_star.test.ui.main.MainFragment
import com.seeking_star.test.ButtonAction.ButtonActionFragment

class ButtonActionActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_button_action)
        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                .replace(R.id.container, ButtonActionFragment.newInstance())
                .commitNow()
        }
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        var returnVal = true

        when(item.itemId) {
            android.R.id.home -> {
                finish()
                Log.d("itemId", "android.R.id.home")
            }
            else -> {
                returnVal = super.onOptionsItemSelected(item)
                Log.d("else", returnVal.toString())
            }
        }

        return returnVal
    }
}

activity_button_action.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ButtonActionActivity" />

ButtonActionFragment.kt

package com.seeking_star.test.ButtonAction

import android.graphics.Color
import androidx.lifecycle.ViewModelProvider
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import com.seeking_star.test.R

class ButtonActionFragment : Fragment() {

    companion object {
        fun newInstance() = ButtonActionFragment()
    }

    private lateinit var viewModel: ButtonActionViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProvider(this).get(ButtonActionViewModel::class.java)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        val view = inflater.inflate(R.layout.fragment_button_action, container, false)
        val button = view.findViewById<Button>(R.id.testButton)
        button.setOnClickListener {
            view.setBackgroundColor(Color.CYAN)
        }
        return view
    }
}

fragment_button_action.xml

<?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:id="@+id/sub"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ButtonAction.ButtonActionFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center">

        <Button
            android:id="@+id/testButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="ボタンを押してみてね" />
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

ButtonActionViewModel.kt

package com.seeking_star.test.ButtonAction

import androidx.lifecycle.ViewModel

class ButtonActionViewModel: ViewModel() {
    // TODO: Implement the ViewModel
}

デモ動画

詳細

今回の肝となる箇所はここの部分だ。

val button = view.findViewById<Button>(R.id.testButton)
button.setOnClickListener {
    view.setBackgroundColor(Color.CYAN)
}

ボタンのオブジェクトを取得したら、setOnClickListenerメソッドを実装する。
この中括弧「{」「}」に書かれている内容がボタンをタップした時のコードになる。

今回はsetBackgroundColorメソッドによって背景色をCYANにしている。
タップ処理を実装しただけだが、今後はタップしたら通信を行ったり、画面遷移を行ったりと実装していく幅が増えるだろう。

参考ページ

  • 「」
  • 「」