我正在構建一個簡歷生成器應用程式。為此,我必須使用視圖系結。在我的應用程式中,翻轉效果很好,我能夠創建具有特定布局的變數的視圖系結物件。但是當我從系結變數呼叫視圖時,它在 .kt 檔案中作業,但在運行應用程式時卻沒有。系結物件顯示視圖。但是當我運行應用程式時,它并沒有按照代碼中的說明作業。
class EducationActivity : AppCompatActivity() {
private lateinit var binding : ActivityEducationBinding
private lateinit var toolbar : Toolbar
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityEducationBinding.inflate(layoutInflater)
setContentView(R.layout.activity_education)
toolbar = findViewById(R.id.toolbar_eduction_activity)
setUpToolbar()
}
private fun setUpToolbar(){
setSupportActionBar(toolbar)
val actionBar = supportActionBar
if (actionBar!=null){
actionBar.setDisplayHomeAsUpEnabled(true)
actionBar.setHomeAsUpIndicator(R.drawable.ic_back_button_action_bar)
actionBar.setDisplayShowTitleEnabled(false)
}
toolbar.setNavigationOnClickListener { onBackPressed() }
}
上面的代碼正在使用: setSupportActionBar(toolbar)
但是當我使用時,setSupportActionBar(binding.toolbarEducationActivity)。運行應用程式時它不起作用。沒有錯誤或任何東西。我不明白這個問題。提前致謝!
uj5u.com熱心網友回復:
問題是您將布局膨脹兩次:
binding = ActivityEducationBinding.inflate(layoutInflater)
setContentView(R.layout.activity_education)
該inflate
呼叫會擴展您的布局 XML,構建視圖層次結構,并將對它的參考存盤在binding
物件中。
然后setContentView
帶有布局參考的呼叫會膨脹另一個完全獨立的視圖層次結構并顯示它。
所以你有兩組視圖,一組可見,另一組不可見。其中的binding
那些是沒有被顯示的——用戶看不到它們或與它們互動,所以它們幾乎沒用。這就是為什么當您嘗試使用binding
.
使用findViewById
而不是在活動的view
層次結構上隱式呼叫它,即顯示的東西。通過這種方式,您可以獲得對Toolbar
實際在螢屏上的參考,而不是在binding
. 因此,當您使用該設備進行設定時,您實際上會看到它在作業!
所以要解決它,你需要確保你的布局膨脹一次,然后讓一切都使用它。有兩種常見的方法來做到這一點:
// inflate your Binding class, and pass the resulting layout to setContentView to display
binding = ActivityEducationBinding.inflate(layoutInflater)
// this root property is the inflated view hierarchy
setContentView(binding.root)
或者
// use setContentView with a layout resource, and let it inflate the views as normal
setContentView(R.layout.activity_education)
// now that the 'view' property for the Activity has been set with the inflated layout,
// you can grab that and -bind- its views to the properties in your Binding class
binding = ActivityEducationBinding.bind(view)
bind
呼叫基本上是發生了什么,inflate
除了你跳過膨脹步驟,因為你已經有一個膨脹的布局。
您可以使用任何一種方法 - 我更喜歡第一種方法,因為您只需通過參考適當的系結類來指定布局資源一次。然后,您只需將充氣的內容傳遞setContentView
給顯示即可。使用第二種方法,您必須確保您使用的 Binding 類與您傳入的布局資源 ID 匹配setContentView
。沒什么大不了的,有時一個比另一個更方便!
但重要的是,在這兩種情況下,您只需要充氣一次。然后一切都使用相同的視圖集,沒有什么奇怪的事情發生。如果您發現自己充氣不止一次,并且您沒有非常具體的理由這樣做,那么這是一個警告信號!
uj5u.com熱心網友回復:
為什么你將 findViewByID 與 viewBinding 一起使用?
你的代碼應該是這樣的
--> 科特林
class EducationActivity : AppCompatActivity() {
private lateinit var binding : ActivityEducationBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityEducationBinding.inflate(layoutInflater)
setContentView(binding.root)
setUpToolbar()
}
private fun setUpToolbar(){
setSupportActionBar(binding.toolbar)
val actionBar = supportActionBar
if (actionBar!=null){
actionBar.setDisplayHomeAsUpEnabled(true)
actionBar.setHomeAsUpIndicator(R.drawable.ic_back_button_action_bar)
actionBar.setDisplayShowTitleEnabled(false)
}
binding.toolbar.setNavigationOnClickListener { onBackPressed() }
}
如果有幫助,請將此標記為答案。
希望這可以幫助!:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/508609.html