
先日 ラムダ式で実装する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でのFragment実装方法 生成と切り替え | Memento Mori Blog