java - tutorial - transition in android
انتقال النشاط عند تغيير البيانات (1)
حصلت على محول الصور حيث كل عنصر هو صورة المستخدم، عند النقر فوقه يفتح نشاطا جديدا مع صورة المستخدم المحدد، لذلك أنا علامة الصورة كعنصر مشترك واستخدام التحولات النشاط.
جزء من الإجراءات التي أقوم بها على النشاط الثاني آثار جميع المستخدمين، وبالتالي فإن محول يدعو notifyDataSetChanged
وإعادة تعيين الموقف إلى أعلى القائمة.
عندما يحدث هذا أنه يفسد الرسوم المتحركة العودة، عندما أغلق النشاط الثاني والعودة إلى قائمة البيانات في ذلك تم تغييرها بحيث الصورة الحصول على الرسوم المتحركة للخلية خاطئة.
لقد حصلت على سؤالين:
- ماذا يمكنني أن أفعل لإعادة رسم الرسوم المتحركة إلى الخلية اليمنى؟ حصلت جميع الخلايا على نفس الرقم المشترك ...
- في حال لم يعد مستخدمي مرئيا في القائمة، كيف يمكنني استبدال الرسوم المتحركة للعودة برسوم متحركة مختلفة؟
ماذا يمكنني أن أفعل لإعادة رسم الرسوم المتحركة إلى الخلية اليمنى؟ حصلت جميع الخلايا على نفس الرقم المشترك.
في النشاط الأول يجب أن يكون لديك بعض المفتاح الذي يحدد العنصر الذي يقوم بتشغيل النشاط الثاني. لنفترض أن لديك Map
فريدة من نوعها userId
s و s s، أي Map<Integer, User>
.
- عند إطلاق النشاط الثاني تمرير مفتاح هذا
User
في الخريطة، دعنا نقول أنه هو42
. (في الخريطة42 -> John Doe
، وأنت تطلق النشاط الثانيJohn Doe
). setExitSharedElementCallback()
في النشاط الأول وتجاوز علىonMapSharedElements()
.override fun onMapSharedElements(names: MutableList<String>?, sharedElements: MutableMap<String, View>?) { // we will implement this in step 6 }
تجاوز
onActivityReenter()
في النشاط الأول وتأجيل الانتقال معsupportPostponeEnterTransition()
، من أجل عدم إظهار الانتقال حتى قمنا ببعض الإجراءات (على سبيل المثال نريد أن انتقل القائمة من أجل إظهار هذا البند).- في
onActivityReenter()
حفظBundle
التي كنت قد مرت من النشاط الثاني عن طريقIntent
(سنرى في الخطوة 7). - بعد تأجيل عملية النقل في
onActivityReenter()
إجراء بعض التغييرات على واجهة المستخدم استنادا إلى المعلومات التي قمت بإضافتها إلى هذه الحزمة. على وجه الخصوص، في حالتنا هذه الحزمة سوف تشمل المفتاحInteger
الأصليUser
الذي أطلق النشاط الثاني. قد تجد المكان الحاليUser
في القائمة بواسطة هذا المفتاح، وانتقلRecyclerView
إلى هذا المنصب الجديد. بعد جعل هذا العنصر مرئية يمكنك دفع الزناد والسماح للنظام بدء الانتقال بواسطةsupportStartPostponedEnterTransition()
. في
SharedElementCallback::onMapSharedElements()
تحقق الطقسBundle
التي قمت بحفظها في الخطوة 4 هي فارغة أو لا. إذا لم تكن فارغة، فهذا يعني أنك قمت بعمل شيء في النشاط الثاني وتريد إعادة تعيين العناصر المشتركة. وهذا يعني أن عليك أن تفعل شيئا من هذا القبيل:override fun onMapSharedElements(names: MutableList<String>?, sharedElements: MutableMap<String, View>?) { // `reenterBundle` is the `Bundle` you have saved in step 3 if (null != reenterBundle && reenterBundle!!.containsKey("KEY_FROM_ACTIVITY_2") && null != view) { val key = reenterBundle!!.getInt("KEY_FROM_ACTIVITY_2"); val newSharedElement = ... // find corresponding view with the `key` val newTransitionName = ... // transition name of the view // clear previous mapping and add new one names?.clear() names?.add(newTransitionName) sharedElements?.clear() sharedElements?.put(newTransitionName, newSharedElement) reenterBundle = null } else { // The activity is exiting } }
في النشاط الثاني تجاوز
finishAfterTransition()
:override fun finishAfterTransition() { val data = Intent() data.putExtra("KEY_FROM_ACTIVITY_2", 42) // `42` is the original position that we passed to this activity via Intent when launching it setResult(RESULT_OK, data) super.finishAfterTransition() }
في حال لم يعد مستخدمي مرئيا في القائمة، كيف يمكنني استبدال الرسوم المتحركة للعودة برسوم متحركة مختلفة؟
يمكنك إما جعلها مرئية (على سبيل المثال عن طريق التمرير RecyclerView
كثيرا، أن يصبح وجهة نظرك مرئية)، أو يمكنك فقط إزالة العناصر المشتركة الانتقالية في الخطوة 6 عن طريق مسح names
و sharedElements
وعدم إضافة أي شيء في نفوسهم.
آمل أن تكون قد تعلمت مفهوم كيف يعمل على الرغم من أنه يبدو فوضوي بعض الشيء. ولكن كمساعدة بالنسبة لك يمكنني مشاركة بعض التعليمات البرمجية من التطبيق كتبه لي: