カッコつけすぎに注意

ときどき setOnClickListener の省略しない使い方がわからなくなるので復習。 こういうのを時々書いて、忘れないようにしなければならない。

            
	class Listener: View.OnClickListener {
		override fun onClick(p0: View?) {
			findViewById(R.id.text1).text = "ボタンが押された"
  		}
	}
  	val listener = Listener()
  	findViewById(R.id.button1).setOnClickListener(listener)



ところで、これをやりながら気づいたのだが、次のものは機能しない。
        findViewById(R.id.button1).setOnClickListener({view,View -> {
        findViewById(R.id.text2).text = "ボタンを押した"}})
ボタンは押せるけど、テキストが変わることはない。 なぜかというと、波カッコ({})が二重になっているから。つまり次が正解。
        findViewById(R.id.button1).setOnClickListener({view,View -> 
        findViewById(R.id.text2).text = "ボタンを押した"})
  
従って、これなんかも動かない。

        findViewById(R.id.button1).setOnClickListener {{
        findViewById(R.id.text2).text = "ボタンを押した"}}        
  
例によって理由はよくわからないけど、波カッコはただまとめるだけじゃなくて、その中に あるものをちょっと違うものにしてしまう働きもあるのだろう。

では、波カッコでないふつうのカッコ()はどうなのだろう。
 findViewById((R.id.button5)).setOnClickListener(({ view:View ->
            findViewById((R.id.text5)).text = "ボタン5が押された" }))   
  

3か所のカッコについて余計につけてみたが、これは機能する。ところが、次のようにすると・・・
       class Listener: View.OnClickListener {
            override fun onClick((p0: View?)) {		//コンパイルエラー
                findViewById((R.id.text1)).text = "ボタンが押された"	//これはOK。
            }
        }
        val listener = Listener(())	//コンパイルエラー
        findViewById((R.id.button1)).setOnClickListener((listener))	//これはOK

        findViewById(R.id.button4).setOnClickListener((object: View.OnClickListener{	//これはOK
            override fun onClick((view: View)){								//コンパイルエラー
                findViewById(R.id.text4).text = "ボタン4が押された"
            }
        }))
  

うまくいくところとうまくいかないところが入り混じる。 多分、もとの関数の変数と、カッコを増やしたことで変数の形が違うからなのか・・・と推測するが、でも関数のカッコを 増やしてもうまくいくところもあるし・・・これもよくわからない。

ということで、やっぱりよくわからないまま終わるのだけど、余計なカッコつけはしなければ問題ないと。

コメント

このブログの人気の投稿

目覚まし時計アプリを公開します

超初心者の機械学習入門

画面回転で苦労した話(原因はわかった)