Android Studioでボタンを押すアプリを作った(そしてハマった)

Android StudioでAndroidアプリを作ろうとしています。全くの初学者なので学習法を探すところから始まります。いろいろ調べてみると、ブログの記事は数年前のものが多く、よく聞くドットインストールも6年くらい前のコンテンツでした。C言語など、枯れた技術なら問題ないですがAndroidのアプリ開発で使うKotlinは最近の言語で年々アップデートされています。数年前に推奨されていたやり方(例えば、FindviewbyidでViewを見つけて、操作するなど)は今や非推奨となり、他のやり方(ViewBindingを使う)が推奨される世界です。数年前の記事など当てにならず、教師役のブログを探すのに手間取りました。ついに見つけたのがこのブログ:nyan のアプリ開発 です。しばらくはこの記事を参考にアプリを作り、ここで紹介していきます。

ボタンを作る

今回はボタンを作りました。

画像1

こんな感じで、押したらPushedとNot pushedが入れ替わるものです(ブログの記事に習って書きましたが、カウンターの方が良かったですね)

カウンターに変更

カウンターに変更したものがこちら。

画像2

ハマったところ

もちろん今回もハマりました。症状は、ボタンを押しても画面の表示が変化しない、です。下に今回ハマったソースと正しいソースを載せます。どこが違うかわかるでしょうか。

 private lateinit var binding: ActivityMainBinding
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       binding = ActivityMainBinding.inflate(layoutInflater)
       setContentView(R.layout.activity_main)
       // Button切り替え用のフラグ
       var flag = false
       binding.button.setOnClickListener {
           if (flag) {
               // flagがtrueの時
               binding.textview.text = "hello)"
               flag = false
           } else {
               // flagがfalseの時
               binding.textview.text = "world)"
               flag = true
           }
       }
   }
}

こちらが正しいコードです。

private lateinit var binding: ActivityMainBinding
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       binding = ActivityMainBinding.inflate(layoutInflater)
       setContentView(binding.root)
       var flag = false
       binding.button.setOnClickListener{
           if ( flag ){
               binding.textview.text = "Pushed"
               flag = false
           } else {
               binding.textview.text = "not pushed"
               flag = true
           }
       }
}

答え合わせ

正:setContentView(binding.root)

誤:setContentView(R.layout.activity_main)

レイアウトファイルをそのまま表示しているのでは、Bindingを用いて部品にアクセスして変更しても反映できない、ということでしょう。

今回のコード

カウンターに変更したコードを載せておきます。

class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       binding = ActivityMainBinding.inflate(layoutInflater)
       var counter = 0
           setContentView(binding.root)
       binding.button.setOnClickListener{
           binding.textview.text = counter.toString()
           counter++
       }
}

この記事が気に入ったらサポートをしてみませんか?