Kotlin初心者のためのonClick()


先日 ラムダ式で実装するonClick() の記事で

Javaでのラムダ式onClick()の実装方法を紹介しました。

今回の記事では非常に簡単なサンプルアプリを用いて、

KotlinでのonClick() 実装方法を紹介していきます。

Kotlin初心者目線で書かれているので、かんたんわかりやすい内容となっています!


・実装するSampleアプリ
「ボタンを押下するとテキストが更新される」


Kotlinとは?



Kotlinはエンジニア業界で人気急上昇中のプログラミング言語です。

Android開発の言語として主に使われていて、

2017年からAndroidの公式サポート言語となったので、将来性も堅実な言語になっています。

Javaよりもモダンな文法が使われていて、Androidアプリの新規開発案件は、

徐々に徐々にJavaからこのモダンなKotlinにシェアが移行しています。


JavaとKotlinのコード比較



早速ロジック部分となっているJavaファイルとKotlinファイルを比較します。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = findViewById(R.id.test_text);
        Button testButton = findViewById(R.id.test_button);

        testButton.setOnClickListener(view -> {
            Log.d(TAG, "Test button pressed!");
            mTextView.setText("TestButtonのクリック検知!");
        });
    }
}


MainActivity.kt

class MainActivity : AppCompatActivity() {

    companion object {
        private const val TAG = "MainActivity"
    }
    private lateinit var mTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mTextView = findViewById(R.id.test_text)
        var testButton = findViewById<Button>(R.id.test_button)
        
        testButton.setOnClickListener{
            Log.d(TAG, "Test button pressed!");
            mTextView.text = "TestButtonのクリック検知!"
        }
    }
}


コード説明



companion object とは


companion object {
    private const val TAG = "MainActivity"
}

ここは初め以下のように記載していて、Warningが表示されていました。

private val TAG = "MainActivity"

Warning

Might be ‘const’

private const val TAG = "MainActivity"

なんだconstをつければいいだけかと思い、
上記のように訂正すると今度は以下のようなエラーが笑

private property name ‘TAG’ doesn’t match regex ‘_ a-z a-za-z d *’

エラーを調べるとどうやらconstはクラスの外で指定しなければならないらしいです。

しかしクラス外でconst宣言をすると別クラスからも直でアクセスできるようになってしまう。

そこで使うのが、companion object {} です。

companion object {} を使うことで、constの定数をクラス内からのみアクセスできるように宣言することができます。

KotlinではJavaにおけるstatic修飾子はなく、

代わりにクラス毎にこの companion object {} で管理します。


lateinit とは


private lateinit var mTextView: TextView

lateinit : 直訳の通り「後で初期化」する時に使います。

Kotlinでは通常nullの代入が許容されていないので、onCreate()でインスタンス化するような変数は、

「後でインスタンス化しますからね!」と明示するために lateinit をつけてあげます。

private TextView mTextView;

↑Javaのこの1行のように、宣言しただけ(nullが入っている)は許されないんです。


setOnClickListener


testButton.setOnClickListener{
    Log.d(TAG, "Test button pressed!");
    mTextView.text = "TestButtonのクリック検知!"
}

testButton.setOnClickListener{ //処理 }

これだけででボタンがクリックされた時の動作を実装することができちゃいます。

testButton.setOnClickListener{ view: View ->
    Log.d(TAG, "Test button pressed!");
    mTextView.text = "TestButtonのクリック検知!"
}

このような記載も可能なので、

「複数ボタンがあって、押下されたボタンをview.idで判別したい!」

みたいなケースではこちらの実装方法を使うと良しです。

mTextView.text = "TestButtonのクリック検知!"

setText()ではなく、.textで直接プロパティにアクセスして書き換えるイメージです。


まとめ



Kotlin初心者の方、同じエラーが出た方に少しでも役立てれば幸いです。

新しい言語にどんどん触れて情報感度を上げていきましょう!

最後にテストアプリの全コードを載せておきます。

ご精読ありがとうございました!!


activity_main.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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/test_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TEST TEXT!"
        android:textColor="#001D74"
        android:textSize="20sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.495"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.425" />

    <Button
        android:id="@+id/test_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:backgroundTint="#00BCD4"
        android:text="Test Button"
        android:textColor="#FFFFFF"
        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.512"
        tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>


MainActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TextView

class MainActivity : AppCompatActivity() {

    companion object {
        private const val TAG = "MainActivity"
    }
    private lateinit var mTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mTextView = findViewById(R.id.test_text)
        var testButton = findViewById<Button>(R.id.test_button)
        testButton.setOnClickListener{
            Log.d(TAG, "Test button pressed!");
            mTextView.text = "TestButtonのクリック検知!"

        }
    }
}

Kotlin初心者のためのonClick()」に1件のコメントがあります

  1. ピンバック: KotlinでのFragment実装方法 生成と切り替え | Memento Mori Blog

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です