ViewBinding
kotlinx.android.synthetic
แก้ไขปัญหาที่ใหญ่ที่สุดของ ในการsynthetic
ผูกหากคุณตั้งค่ามุมมองเนื้อหาของคุณเป็นเค้าโครงแล้วพิมพ์ id ที่มีอยู่ในเค้าโครงที่แตกต่างกันเท่านั้น IDE ช่วยให้คุณเติมข้อความอัตโนมัติและเพิ่มคำสั่งการนำเข้าใหม่ นอกจากว่านักพัฒนาจะตรวจสอบเป็นพิเศษเพื่อให้แน่ใจว่างบการนำเข้าของพวกเขาเพียงนำเข้ามุมมองที่ถูกต้องไม่มีวิธีที่ปลอดภัยในการตรวจสอบว่าสิ่งนี้จะไม่ทำให้เกิดปัญหารันไทม์ แต่ในที่ViewBinding
คุณควรใช้layout
วัตถุที่มีผลผูกพันของคุณในการเข้าถึงมุมมองของมันเพื่อให้คุณไม่เคยเรียกดูในรูปแบบที่แตกต่างกันและถ้าคุณต้องการทำเช่นนี้คุณจะได้รับข้อผิดพลาดในการรวบรวมไม่ใช่ข้อผิดพลาดรันไทม์ นี่คือตัวอย่าง
เราสร้างสองรูปแบบที่เรียกว่าactivity_main
และactivity_other
ชอบโดย:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/message_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
activity_other.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/message_other"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
ตอนนี้ถ้าคุณเขียนกิจกรรมของคุณเช่นนี้:
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_other.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//Application will crash because "message_other" doesn't exist in "activity_main"
message_other.text = "Hello!"
}
}
รหัสของคุณจะรวบรวมโดยไม่มีข้อผิดพลาดใด ๆ แต่แอปพลิเคชันของคุณจะทำงานล้มเหลวในขณะทำงาน เนื่องจากมุมมองที่มีmessage_other
id ไม่มีอยู่activity_main
และคอมไพเลอร์ไม่ได้ตรวจสอบสิ่งนี้ แต่ถ้าคุณใช้ViewBinding
เช่น:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
//This code will never compile and the IDE shows you an error
binding.message_other.text = "Hello!"
}
}
รหัสของคุณจะไม่รวบรวมและAndroid Studio
แสดงข้อผิดพลาดในบรรทัดสุดท้าย