小企業(yè)做網(wǎng)站多少錢開發(fā)新客戶的十大渠道
書籍:
《第一行代碼 Android》第三版
開發(fā)環(huán)境:
Android Studio Jellyfish | 2023.3.1
問題:
3.2.4在Activity中使用Toast章節(jié)中使用到了kotlin-android-extensions插件,但是該插件已經(jīng)淘汰,根據(jù)網(wǎng)上了解,目前使用了新的技術(shù)VewBinding替代了改功能.
ViewBinding的使用
在gradle中使能VewBinding
在app級別的build.gradle.kts中的android閉包中添加buildFeatures,設(shè)置viewBinding 為 true,這里請注意,好像不同版本的android studio對于這個使能的寫法還不一致,這個也是導(dǎo)致了折騰了兩天都沒有搞清楚這玩意的原因.目前我的版本中的寫法如下:
buildFeatures {viewBinding = true}
這個build.gradle.kts所在路徑在項目根目錄/app/build.gradle.kts.
編寫layout布局文件
由于我一開始創(chuàng)建的是Add No Activity的項目,所以我的項目中是沒有l(wèi)ayout的,需要在項目根目錄/app/src/main/res/下創(chuàng)建一個layout目錄,并在layout中創(chuàng)建一個名為first_layout.xml的布局文件,請記住這個名字,后面會用到.
創(chuàng)建first_layout.xml文件時會自動生成一些代碼,目前我們不關(guān)注,先添加一個簡單的按鈕,代碼如下:
<Buttonandroid:id="@+id/button1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Button 1"/>
Sync同步build.gradle.kts文件生成與布局文件對應(yīng)的類
我們編寫了一個first_layout.xml布局文件了,如果想要通過ViewBinding能正常使用該布局文件中的控件,則需要將該布局文件first_layout.xml生成對應(yīng)的FirstLayoutBinding.java類.
Sync的方法:打開build.gradle.kts文件,在菜單中Run->Run?build.gradle.kts即可同步修改的build.gradle.kts到項目中.
在創(chuàng)建了first_layout.xml后Sync了build.gradle.kts文件后,可在項目路徑ActivityTest\app\build\generated\data_binding_base_class_source_out\debug\out\com\example\activitytest\databinding下自動生成與first_layout.xml布局文件對應(yīng)的FirstLayoutBinding.java類.
xml布局文件生成對應(yīng)的類的命名規(guī)則:將 XML 文件的名稱轉(zhuǎn)換為駝峰式大小寫,并在末尾添加“Binding”,如first_layout.xml生成FirstLayoutBinding.java.
不希望生成某布局文件對應(yīng)的類的方法
若以后創(chuàng)建了很多布局文件,并且可能不需要使用到這些布局文件,那么在Sync build.gradle.kts的時候不希望生成對應(yīng)的類.那么可以在這些布局文件中加上兩句代碼,即可讓gradle忽略此布局文件.
如first_layout.xml,不想生成對應(yīng)的FirstLayoutBinding.java,則在first_layout.xml文件中,增加以下兩句代碼即可,xmlns:tools="http://schemas.android.com/tools"表示導(dǎo)入tools工具,tools:viewBindingIgnore="true"表示忽略ViewBinding.
xmlns:tools="http://schemas.android.com/tools"tools:viewBindingIgnore="true"
此時,如果去Sync build.gradle.kts文件,那么在項目路徑ActivityTest\app\build\generated\data_binding_base_class_source_out\debug\out\com\example\activitytest\databinding\不會看到對應(yīng)的FirstLayoutBinding.java類.
麻煩把這兩句代碼刪除,并重新Sync? build.gradle.kts一下,因為我們接下來要使用FirstLayoutBinding.java中的控件了.
在Activity中使用布局中的控件
現(xiàn)在,我們已經(jīng)新建好了布局文件first_layout.xml,并且成功將其生成對應(yīng)的FirstLayoutBinding.java類,那么我們現(xiàn)在開始使用first_layout.xml中定義按鈕button1.
import com.example.activitytest.databinding.FirstLayoutBindingclass FirstActivity : AppCompatActivity() {private lateinit var mainBinding: FirstLayoutBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.first_layout)mainBinding = FirstLayoutBinding.inflate(layoutInflater)setContentView(mainBinding.root)mainBinding.button1.setOnClickListener {Toast.makeText(this, "You are the best!", Toast.LENGTH_SHORT).show()}}
}
因為要引用FirstLayoutBinding.java類中的控件,所有要先將這個類導(dǎo)入:
import com.example.activitytest.databinding.FirstLayoutBinding
然后定義一個FirstLayoutBinding變量,
private lateinit var mainBinding: FirstLayoutBinding
調(diào)用生成的綁定類中包含的靜態(tài) inflate() 方法。此操作會創(chuàng)建該綁定類的實例以供 Activity 使用。
通過調(diào)用 getRoot() 方法或使用 Kotlin 屬性語法獲取對根視圖的引用。
mainBinding = FirstLayoutBinding.inflate(layoutInflater) setContentView(mainBinding.root)
直接使用FirstLayoutBinding中的button1按鈕控件實現(xiàn)點擊該按鈕的時候觸發(fā)一個Toast提示信息.
mainBinding.button1.setOnClickListener {Toast.makeText(this, "You are the best!", Toast.LENGTH_SHORT).show() }