我是 Android 開發的新手。當我使用 ViewBinding 訪問布局中的專案時,我遇到了一個關于在哪里初始化變數的問題。
正如你在代碼中看到的,我宣告了兩個實體變數,但只在 onCreate 方法之前初始化變數標簽。
我的問題是,為什么我不能在 onCreate 方法之前像變數標記一樣初始化變數系結,因為我可以在 onCreate 方法中訪問變數標記而不會出錯?我做了一個測驗,在 onCreate 之前初始化系結,但程式崩潰了。
這是我的代碼:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val tag = "MainActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(tag, "onCreate") // I can access to variable tag
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.startNormalActivity.setOnClickListener {
val intent = Intent(this, NormalActivity::class.java)
startActivity(intent)
}
binding.startDialogActivity.setOnClickListener {
val intent = Intent(this, DialogActivity::class.java)
startActivity(intent)
}
}
}
uj5u.com熱心網友回復:
要直接或通過系結來擴充布局,您需要一個LayoutInflater. 諸如布局充氣器之類的系統服務Activity在其onCreate生命周期階段之前不可用。實體初始化過早。
您tag使用字串文字進行了初始化,這在 init 階段當然是可能的。
uj5u.com熱心網友回復:
你不能在 OnCreate() 之前創建系結。系結是自動生成的類,它們負責這樣視圖層次結構在它系結到具有布局內運算式的視圖之前不會被修改。OnCreate() 是創建 Activity 時呼叫的第一個函式。有關 Activity LifeCycle 的更多詳細資訊,請參閱此處:
https://developer.android.com/guide/components/activities/activity-lifecycle
因此,當創建 Activity 時,您會膨脹以 xml 檔案形式創建的布局。在膨脹布局之后,系結程序被實體化。膨脹布局的程序在 OnCreate() 中執行,如您在代碼中所見:
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
因此,您不能在 OnCreate() 之前生成系結,而必須在 OnCreate 中完成或在擴展您的布局后隨時發布。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/392507.html
