java - tutorial - transition in android



انتقال النشاط عند تغيير البيانات (1)

ماذا يمكنني أن أفعل لإعادة رسم الرسوم المتحركة إلى الخلية اليمنى؟ حصلت جميع الخلايا على نفس الرقم المشترك.

في النشاط الأول يجب أن يكون لديك بعض المفتاح الذي يحدد العنصر الذي يقوم بتشغيل النشاط الثاني. لنفترض أن لديك Map فريدة من نوعها userId s و s s، أي Map<Integer, User> .

  1. عند إطلاق النشاط الثاني تمرير مفتاح هذا User في الخريطة، دعنا نقول أنه هو 42 . (في الخريطة 42 -> John Doe ، وأنت تطلق النشاط الثاني John Doe ).
  2. setExitSharedElementCallback() في النشاط الأول وتجاوز على onMapSharedElements() .

    override fun onMapSharedElements(names: MutableList<String>?,
                                 sharedElements: MutableMap<String, View>?) {
        // we will implement this in step 6                            
    }
  3. تجاوز onActivityReenter() في النشاط الأول وتأجيل الانتقال مع supportPostponeEnterTransition() ، من أجل عدم إظهار الانتقال حتى قمنا ببعض الإجراءات (على سبيل المثال نريد أن انتقل القائمة من أجل إظهار هذا البند).

  4. في onActivityReenter() حفظ Bundle التي كنت قد مرت من النشاط الثاني عن طريق Intent (سنرى في الخطوة 7).
  5. بعد تأجيل عملية النقل في onActivityReenter() إجراء بعض التغييرات على واجهة المستخدم استنادا إلى المعلومات التي قمت بإضافتها إلى هذه الحزمة. على وجه الخصوص، في حالتنا هذه الحزمة سوف تشمل المفتاح Integer الأصلي User الذي أطلق النشاط الثاني. قد تجد المكان الحالي User في القائمة بواسطة هذا المفتاح، وانتقل RecyclerView إلى هذا المنصب الجديد. بعد جعل هذا العنصر مرئية يمكنك دفع الزناد والسماح للنظام بدء الانتقال بواسطة supportStartPostponedEnterTransition() .
  6. في 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
        }                            
    }
  7. في النشاط الثاني تجاوز 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 وعدم إضافة أي شيء في نفوسهم.

آمل أن تكون قد تعلمت مفهوم كيف يعمل على الرغم من أنه يبدو فوضوي بعض الشيء. ولكن كمساعدة بالنسبة لك يمكنني مشاركة بعض التعليمات البرمجية من التطبيق كتبه لي:

ميناكتيفيتي - مينبريسنتر

DetailActivity

حصلت على محول الصور حيث كل عنصر هو صورة المستخدم، عند النقر فوقه يفتح نشاطا جديدا مع صورة المستخدم المحدد، لذلك أنا علامة الصورة كعنصر مشترك واستخدام التحولات النشاط.

جزء من الإجراءات التي أقوم بها على النشاط الثاني آثار جميع المستخدمين، وبالتالي فإن محول يدعو notifyDataSetChanged وإعادة تعيين الموقف إلى أعلى القائمة.

عندما يحدث هذا أنه يفسد الرسوم المتحركة العودة، عندما أغلق النشاط الثاني والعودة إلى قائمة البيانات في ذلك تم تغييرها بحيث الصورة الحصول على الرسوم المتحركة للخلية خاطئة.

لقد حصلت على سؤالين:

  1. ماذا يمكنني أن أفعل لإعادة رسم الرسوم المتحركة إلى الخلية اليمنى؟ حصلت جميع الخلايا على نفس الرقم المشترك ...
  2. في حال لم يعد مستخدمي مرئيا في القائمة، كيف يمكنني استبدال الرسوم المتحركة للعودة برسوم متحركة مختلفة؟




activity-transition