《學習筆記》被廢棄的Kotlin Android Extensions外掛替代品 View Binding

shijf發表於2021-02-18

《Android 第一行程式碼》學習中,去年出的書感覺,今年就有點舊了。92頁中,使用的Kotlin Android Extensions外掛,官方已經廢棄,替代品為 View Binding, 參考文章 【譯】遷移被廢棄的Kotlin Android Extensions外掛

ActivityMainBinding.inflate(getLayoutInflater())不起作用

作者原文

package com.example.activitytest

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import com.example.activitytest.databinding.FirstLayoutBinding

class FirstActivity : AppCompatActivity() {
    private lateinit var binding:  FirstLayoutBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

//        setContentView(R.layout.first_layout)

//    val button = findViewById<Button>(R.id.button) //  1. 泛型顯示的指定型別
//        val button: Button = findViewById(R.id.button) //  2. 顯示的指定型別
//        button.setOnClickListener {
//            Toast.makeText(this, "You click Button 1", Toast.LENGTH_SHORT).show()
//        }

//        binding.

        // 最新推薦寫法
            binding = FirstLayoutBinding.inflate(layoutInflater)
            setContentView(binding.root)
            binding.button.setOnClickListener {
                Toast.makeText(this, "You click Button 1", Toast.LENGTH_SHORT).show()
            }
    }

}

二、在自定義元件中使用(ViewBinding 在自定義控制元件【view 】中不起作用)

package com.example.uiwidgettest

import android.app.Activity
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.LinearLayout
import android.widget.Toast
import com.example.uiwidgettest.databinding.TitleBinding

class TitleLayout(context: Context, attrs: AttributeSet): LinearLayout(context, attrs) {
    // 第三個引數必須為 true,待以後學完書籍後解惑,現在認為是在父級中直接嵌入
    private var binding = TitleBinding.inflate(LayoutInflater.from(context), this, true)
    init {
        LayoutInflater.from(context).inflate(R.layout.title, this)

        binding.titleBack.setOnClickListener {
            val activity = context as Activity
            activity.finish()
        }

        binding.titleEdit.setOnClickListener {
            Toast.makeText(context, "You clicked Edit button", Toast.LENGTH_LONG).show()
        }
    }
}
//  println("以下是傳統的寫法")
//        val  titleBack = findViewById<Button>(R.id.titleBack)
//        titleBack.setOnClickListener {
//            val activity = context as Activity
//            println("以下是舊的寫法")
//            activity.finish()
//        }
//
//        val titleEdit = findViewById<Button>(R.id.titleEdit)
//
//        titleEdit.setOnClickListener {
//            Toast.makeText(context, "You clicked Edit button", Toast.LENGTH_LONG).show()
//        }
//    }
//}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
支付寶領個紅包就是對我最大的讚賞了

相關文章