LoginSignup
0
1

More than 1 year has passed since last update.

【Kotlin研修2日目】トーストとListViewへのリスナ定義

Last updated at Posted at 2021-06-03

トースト

参考: トースト

Toastオブジェクトのインスタンス化

定義

Toast.makeText(context: Context, text: CharSequence, duration: Int)
// パラメータ
// context: トーストを表示させるアクティビティオブジェクト(=Activityインスタンス)
// text: トーストで表示する文字列
// duration: トーストを表示する時間

サンプルコード

MainActivity.kt
val show = "test"

val toast = Toast.makeText(this@MainActivity, show, Toast.LENGTH_LONG)

説明

Contextクラス

Activityクラスの親クラス。

context

thisは自身のインスタンスを指すが、コンパイルエラーや誤作動を避けるためにthis@アクティビティクラス名という記述を行う。
また、Contextクラスが保持するapplicationContextプロパティも利用できるが、コンテキストの指定が不明瞭になるため非推奨。

duration

トーストを表示する時間を、Toastクラスの定数を使って指定する。
Toastクラスの定数は以下の2種類。

定数 内容
Toast.LENGTH_LONG 長い
Toast.LENGTH_SHORT 短い

Toastオブジェクトの表示

サンプルコード

toast.show()

リスト形式のビュー(ListView, Spinner)のリスナクラス

MainActivity.kt
class MainActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
    }

    // ListViewのItemをタップした場合のリスナクラス(リスナ)
    // AdapterView: ListView, Spinnerの親クラス
    // OnItemClickListener: "タップ"イベントを検知するAdapterViewのメンバインタフェース
    private inner class ListItemClickListener: AdapterView.OnItemClickListener {

        // タップ時の処理(イベントハンドラ)
        // view: (タップされた)ビュー(=ListViewのItem(=TextView))
        // position: (タップされた)ItemのIndex
        // id: (SimpleCursorAdapterを使用する場合)DBの主キー
        //     (それ以外の場合)positionと同じ値
        override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {

            // ListViewのItem(TextView)の値をIndex番号から取得, String型に変換
            // parent: AdapterView
            // getItemAtPosition(): 指定したIndexのtext値を取得(返り値はAny型)
            val item = parent?.getItemAtPosition(position) as String
            // トーストで表示する文字列
            val show = "you chose: " + item

            // Toast.makeText(context:text:duration:): Toastオブジェクトのインスタンス化
            // context: トーストを表示させるアクティビティオブジェクト(=Activityインスタンス)
            // text: トーストで表示する文字列
            // duration: トーストを表示する時間
            val toast = Toast.makeText(this@MainActivity, show, Toast.LENGTH_LONG)

            // トーストの表示
            toast.show()
        }
    }

リスナのセット

セッタがリスナプロパティのセッタでない場合

参考: 研修1日目
setOnClickListener()メソッドは、onClickListenerプロパティのセッタではないため、
onClickListenerプロパティにリスナを直接代入(=アクセス)し、リスナとして定義することができない。

MainActivity.kt
// リスナとするオブジェクトの定義
val btClick = findViewById<Button>(R.id.btClick)
// リスナクラスのインスタンス化(実体化)
val listener = HelloListener()

// オブジェクトをリスナとして設定
btClick.setOnClickListener(listener)

セッタがリスナプロパティのセッタである場合

setOnItemClickListener()メソッドは、onItemClickListenerプロパティのセッタであるため、
onItemClickListenerプロパティにリスナを直接代入することで、自動的にセッタを呼び出し、リスナとして定義することができる。

MainActivity.kt
// リスナとするオブジェクトの定義
val lvMenu = findViewById<ListView>(R.id.lvMenu)

// 本来はこっち
// リスナクラスのインスタンス化(実体化)
val listener = ListItemClickListener()
// オブジェクトをリスナとして設定
lvMenu.setOnItemClickListener(listener)

// 上記の条件を満たす場合(直接リスナプロパティにリスナをセット)
lvMenu.onItemClickListener = ListItemClickListener()

使い分け

上記条件に該当する場合は、Android StudioUse property access syntaxとプロパティへのアクセスで記述するように提案してくれるので、最初から意図的にセッタを呼び出してリスナを定義する。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1