يُسهل View Binding كتابة التعليمات البرمجية التي تتفاعل مع طرق العرض. إليك كيفية إعداده في مشروع Android Gradle الخاص بك.
ربما يكون معظم مطوري Android على دراية بالأسلوب الكلاسيكي findViewById()
طريقة. قم بتمرير معرف أحد طرق العرض في تخطيط XML الخاص بك وسيقوم بإرجاع مرجع إلى الإصدار المضخم من هذا العرض. هذا كله على افتراض أنك قمت بتمرير المعرف الصحيح، وأن طريقة العرض موجودة بالفعل. findViewById()
لا يحتوي على أي عمليات تحقق مضمنة لمنعك من محاولة استرداد طريقة عرض لا يمكنك استردادها. أدخل عرض ملزمة.
بدلا من استخدام findViewById()
في كل طريقة عرض تريدها، يقوم View Binding تلقائيًا بإنشاء فئة ربط لكل تخطيط XML. تتم إضافة كل طريقة عرض بمعرف تلقائيًا إلى الفصل الدراسي، حتى تتمكن من الرجوع إليها مباشرةً.
تعد إضافة View Binding إلى مشروع Android Gradle أمرًا بسيطًا للغاية.
إعداد Gradle
يتم تمكين عرض الربط على مستوى الوحدة في Gradle. إذا كان لديك وحدات متعددة، فستحتاج إلى تمكينها بشكل فردي لكل وحدة.
في ال android
كتلة في مستوى الوحدة الخاصة بك build.gradle
، أضف خيار تمكين عرض الربط.
android {
...
buildFeatures {
viewBinding true
}
}
قد يكون هناك تحذير بشأن الوصول غير القانوني، ولكن هذا خطأ ويمكن تجاهله بأمان.
سيتم تمكين مزامنة المشروع وعرض الربط. انه من السهل.
باستخدام عرض ملزمة
هناك عدة طرق لاستخدام View Binding، ولكن قبل حدوث أي من ذلك، دعونا نتحدث عن كيفية إنشاء فئات الربط.
بناء جملة اسم الفئة
لنفترض أن لديك تخطيط XML مسمى some_layout.xml
. سيتم تسمية فئة الربط المقابلة لها SomeLayoutBinding
. ينطبق هذا النمط على كافة الملفات.
ستتم كتابة كل كلمة (مفصولة بشرطات سفلية في اسم الملف) بأحرف كبيرة، وستتم إزالة الشرطات السفلية. ثم تتم إضافة "الربط" إلى النهاية.
إنشاء مثيل مع العرض الموجود
إذا قمت بالفعل بتضخيم ملف التخطيط وكان لديك مرجع إلى جذر التخطيط، فيمكنك إخبار فئة ربط العرض باستخدام التخطيط الموجود.
كوتلين:
val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)
جافا:
SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);
على سبيل المثال، إذا أردت استخدام فئة الربط في جزء، فسيبدو الأمر على هذا النحو.
كوتلين:
classSomeFragment : Fragment(R.layout.some_layout) {
//Lazy initialization means bind() won't be called until "binding" is referenced.
private val binding by lazy { SomeLayoutBinding.bind(view) }
override fun onViewCreated(view: View, savedInstanceState: Bundle?){
super.onViewCreated(view, savedInstanceState)
//Once this method is called, you can start using the binding.
}
}
جافا:
publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;publicSomeFragment(){
super(R.layout.some_layout);
}
@Override
publicvoidonViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
//Initialize the binding.
binding = SomeLayoutBinding.bind(view);
}
}
إنشاء مثيل باستخدام طريقة عرض جديدة
يمكن لفئة الربط أيضًا الاهتمام بتضخيم التخطيط نيابةً عنك.
كوتلين:
val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)
جافا:
SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);
هذه الطريقة مفيدة في كل من الأجزاء والأنشطة.
ان جزء سبيل المثال سيبدو مثل ما يلي.
كوتلين:
classSomeFragment : Fragment() {
private val binding by lazy { SomeLayoutBinding.inflate(LayoutInflater.from(requireContext())) }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?){
//The "root" of the binding class is the root of its layout.
return binding.root
}
}
جافا:
publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;
@Override
publicvoidonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
//Initialize the binding.
binding = SomeLayoutBinding.inflate(inflater);
//The "getRoot()" method of the binding class returns the root of the layout.
return binding.getRoot();
}
}
ان نشاط المثال سيبدو مثل ما يلي.
كوتلين:
classSomeActivity : AppCompatActivity() {
private val binding by lazy { SomeLayoutBinding.inflate(layoutInflater) }override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.root)
}
}
جافا:
publicclassSomeActivityextendsAppCompatActivity{
private SomeLayoutBinding binding = null;@Override
protectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//Instantiate the binding.
binding = SomeLayoutBinding.inflate(getLayoutInflater());
//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.getRoot());
}
}
وجهات النظر المرجعية
الآن بعد أن تم إعداد فئة ربط العرض وجاهزة للاستخدام، فقد حان الوقت لاستخدامها فعليًا.
دعنا نقول محتويات some_layout.xml
هي شيء مثل ما يلي:
android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>
هناك الكثير من المعرفات التي يمكن الرجوع إليها في الكود. ولكن طالما تم إنشاء مثيل لفئة الربط، فسيكون المرجع سهلاً.
في Kotlin، تتم الإشارة إلى طرق العرض بواسطة متغيرات تطابق معرفاتها، مع بعض التغييرات. تتم إزالة الشرطات السفلية وتكون السلسلة الناتجة مغلفة بالجمل. على سبيل المثال، للإشارة some_frame_layout
من الكود الذي ستستخدمه binding.someFrameLayout
. ال someFrameLayout
سيكون المتغير مثيلاً لـ FrameLayout.
val someFrameLayout: FrameLayout = binding.someFrameLayout
في Java، تتم الإشارة إلى طرق العرض باستخدام طرق getter التي تطابق معرفاتها، بتنسيق مشابه لـ Kotlin. على سبيل المثال، للإشارة some_frame_layout
، ستستخدم binding.getSomeFrameLayout()
. ستقوم الطريقة بإرجاع مثيل FrameLayout.
FrameLayout someFrameLayout = binding.getSomeFrameLayout();
يتم أيضًا تسوية مراجع العرض في التجليد. المرجعية inner_imageview
هو نفس المرجع some_frame_layout
.
خاتمة
كما ترى، فإن View Binding في Android سهل التنفيذ وسهل الاستخدام. في كثير من الحالات، يكون استخدامه أسهل من findViewById()
.
لمزيد من التفاصيل حول تنفيذ View Binding، بالإضافة إلى بعض الأمثلة، تحقق من وثائق جوجل الرسمية.