لم يعد kotlinx.android.synthetic ممارسة موصى بها. الإزالة لصالح صريح findViewById
بالطبع ، كان هذا مناسبًا للغاية ، خاصة إذا كان لديك مشروع بالكامل في Kotlin. ومع ذلك ، فإن العالم يتغير والآن نحن بحاجة للبحث عن بدائل. في هذه المقالة ، سنلقي نظرة سريعة على ماهية المكون الإضافي Kotlin Android Extension ، وما هي المشكلات التي واجهته ، وما يجب علينا نحن مطورو Android فعله الآن. تم استخدام المواد في هذه المقالة جزئيًا . إذا هيا بنا.
لمحة سريعة عن ملحقات Kotlin Android
Kotlin Android Extensions هو مكون إضافي لـ Kotlin يسمح لك باستعادة المشاهدات من الأنشطة والأجزاء والعروض دون كتابة رمز معياري معياري مثل findViewById.
يُنشئ المكون الإضافي رمزًا إضافيًا يسمح لك بالوصول إلى طريقة العرض بتنسيق XML ، تمامًا كما لو كنت تتعامل مع الخصائص المسماة id التي استخدمتها عند تحديد البنية.
يقوم أيضًا بإنشاء ذاكرة تخزين مؤقت لعرض محلي. عند أول استخدام للخاصية ، سينفذ المكون الإضافي findViewById القياسي. بعد ذلك ، سيتم استعادة العرض من ذاكرة التخزين المؤقت ، لذلك سيكون الوصول إليه أسرع.
إذا كان كل هذا مريحًا جدًا ، فلماذا تم إهماله؟
مشكلات ملحقات Kotlin Android
- يتم استخدام التسمية العالمية للمعرفات. قد تظهر المواقف عندما يكون لدى طرق العرض المختلفة نفس المعرف في تخطيطات مختلفة - وفقًا لذلك ، فقط في مرحلة تشغيل التطبيق ستكتشف أنك استخدمت معرفًا خاطئًا.
- يمكن استخدامها فقط في مشاريع Kotlin (غطاء)
- أمان Null مفقود. في حالة تقديم عرض في تكوين وغياب في تكوين آخر ، قد يحدث عطل ، لأنه لا توجد معالجة لمثل هذه المواقف
- لا يمكن استخدامها في المشاريع متعددة الوحدات. سيناريو شائع جدًا: لديك وحدة UI Kit التي تخزن مكونات واجهة المستخدم الشائعة التي تريد إعادة استخدامها في وحدات أخرى. لا تزال هناك مشكلات معلقة من غير المرجح أن يتم تصحيحها. في مثل هذا السيناريو ، عادةً ما يتم استخدام طريقة البحث القديمة الجيدة:
- , , — , , . — Kotlin Android Extensions .
- KotterKnife (, ).
- FindViewById() — , .
- AndroidAnnotations ( 2015)
- View Binding Google — !
View Binding Google
لذا ، فإن الفائز في هذه القائمة هو ViewBinding من Google (يجب عدم الخلط بينه وبين DataBinding). دعونا نلقي نظرة سريعة على ما هو عليه.
View Binding هي أداة تسهل كتابة التعليمات البرمجية للتفاعل مع طريقة العرض. عند تمكين View Binding في وحدة نمطية معينة ، فإنه ينشئ فئات ربط لكل ملف تخطيط في الوحدة النمطية. يحتوي كائن فئة الربط الذي تم إنشاؤه على ارتباطات لجميع طرق العرض من ملف العلامات ، والذي تم تحديد معرف android من أجله.
والمزايا الرئيسية لـ View Binding هي Null safety و Type safety.
الشروع في عرض ملزم
يعد بدء استخدام ViewBinding أمرًا سهلاً بدرجة كافية. تحتاج إلى إضافة خيار للبناء.
android {
...
buildFeatures {
viewBinding true
}
}
بعد ذلك ، يمكنك استخدامه بالفعل. تحتوي كل فئة ربط تم إنشاؤها على ارتباط إلى طريقة عرض الجذر للترميز (الجذر) وروابط لجميع طرق العرض التي تحتوي على معرف. يتكون اسم الفئة الذي تم إنشاؤه من "اسم ملف الترميز" ، ويُترجم إلى حالة الجمل + "الربط". على سبيل المثال ، لملف الترميز result_profile.xml:
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
سيتم إنشاء فئة ResultProfileBinding تحتوي على حقلين: اسم TextView وزر الزر.
استخدم في النشاط
على سبيل المثال ، لديك هذا التخطيط:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
نتيجة ViewBinding:
public final class ActivityMainBinding implements ViewBinding {
@NonNull
private final ConstraintLayout rootView;
@NonNull
public final TextView textView;
يمكنك استخدام viewBinding مثل هذا:
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
والآن ، بعد أن حصلنا على روابط العرض:
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
إذا كنت تستخدم ViewBinding في جزء واحتفظت بالرابط للربط في الجزء (وليس فقط في طريقة onCreateView ()) ، فلا تنسَ مسح الروابط في طريقة onDestroyView ().
مثال:
private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ResultProfileBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
يجب أن يتم ذلك بسبب الجزء ودورة حياة العرض:
بشكل عام ، لا يعد التبديل إلى ViewBinding أمرًا صعبًا بدرجة كافية ، على الرغم من أنه من المؤسف أن يتم إهمال ملحقات Kotlin Android. لا تنس الانضمام إلينا على Telegram ، ويتم نشر مواد مفيدة لمطوري Android والبرامج التعليمية الحديثة على نظام AndroidSchool.ru .
روابط مفيدة: