ป้องกันการเปลี่ยนกิจกรรมโดยสิ้นเชิงจากการรบกวนการเปลี่ยนองค์ประกอบที่แบ่งใช้:
  ในกิจกรรมการออกให้เรียก getWindow (). setExitTransition (null);
  
  ในกิจกรรมการป้อนเรียก getWindow (). setEnterTransition (null);
จากhttps://stackoverflow.com/a/34907685/967131
ฉันสงสัยว่านี่อาจมีผลข้างเคียง แต่ไม่รู้แน่ชัด มันตายง่ายและใช้ได้ผล
ป้องกันไม่ให้องค์ประกอบบางอย่างกะพริบ:
ฉันเริ่มต้นด้วยคำตอบของ Alex Lockwoodและทำการทดลองเล็กน้อยเพื่อพยายามทำให้มันได้ผล หลักของมันถูกต้องแม้ว่าฉันไม่ต้องการรหัสที่เขาแนะนำสำหรับกิจกรรมการรับ แต่ฉันพบปัญหาบางอย่างโดยเรียกมันใน Fragment (แทนที่จะเป็นกิจกรรม) และโดยการตั้งค่าแถบเครื่องมือเป็นแถบการดำเนินการ
โอ้เศษเสี้ยว? ฉันเห็นความคิดเห็นมากมายที่พยายามดึงข้อมูลอ้างอิงไปยังแถบสถานะและแถบนำทางเป็นโมฆะ สิ่งเดียวกันก็เกิดขึ้นกับฉันเช่นกันจนกระทั่งฉันตระหนักว่าฉันจะไม่พบสิ่งเหล่านั้นในเค้าโครงของ Fragment ... พวกมันอยู่เหนือระดับนั้น ดังนั้นรหัสด้านล่างเพื่อรับมุมมองการตกแต่งจากกิจกรรมและค้นหาสิ่งนั้น จากนั้นฉันก็พบว่าพวกเขาไม่มีปัญหา
ในท้ายที่สุดฉันได้พัฒนาวิธียูทิลิตี้นี้:
public static Bundle transitionOptions(Activity activity, int transitionViewResId, int transitionNameResId) {
   if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
       return null;
   }
   View decorView = activity.getWindow().getDecorView();
   View statusBar = decorView.findViewById(android.R.id.statusBarBackground);
   View navigationBar = decorView.findViewById(android.R.id.navigationBarBackground);
   View appBarLayout = decorView.findViewById(**R.id.appbarlayout**);
   View transitionView = decorView.findViewById(transitionViewResId);
   String transitionName = activity.getString(transitionNameResId);
   List<Pair<View, String>> pairs = new ArrayList<>();
   pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
   pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
   if (appBarLayout != null) {
       pairs.add(Pair.create(appBarLayout, activity.getString(**R.string.transition_appbarlayout**)));
   }
   pairs.add(Pair.create(transitionView, transitionName));
   //noinspection unchecked - we're not worried about the "unchecked" conversion of List<Pair> to Pair[] here
   return ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs.toArray(new Pair[pairs.size()]))
           .toBundle();
}
หมายเหตุR.string.transition_appbarlayoutและR.id.appbarlayout รหัสเหล่านี้เป็นรหัสโดยพลการตราบใดที่ตรงกับสิ่งที่รหัสของคุณใช้ ใน XML ของฉันฉันจัดวางแถบการดำเนินการที่กำหนดเองดังนี้ (แก้ไขลงไปที่ข้อมูลสำคัญ):
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
    android:id="**@+id/appbarlayout**"
    android:transitionName="**@string/transition_appbarlayout**">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"/>
</android.support.design.widget.AppBarLayout>
หากคุณไม่ใช้ Toolbar เช่นนี้ส่วนนั้นสามารถลบออกจากวิธียูทิลิตี้ได้
จากนั้นคุณจะเรียกมันใน Fragment ของคุณดังนี้:
startActivity(intent, UIUtils.transitionOptions(getActivity(),
                        R.id.**my_view**,
                        R.string.**transition_my_view**));
ใช้ค่าใดก็ได้ที่คุณต้องการตราบเท่าที่ตรงกับ XML ของคุณ
ซึ่งจะป้องกันไม่ให้แถบสถานะแถบเครื่องมือและแถบนำทาง (ปุ่มย้อนกลับ / บ้าน / แอปล่าสุด) กะพริบระหว่างการเปลี่ยน ส่วนที่เหลือของการเปลี่ยนแปลงกิจกรรมเป็นเรื่องปกติ
ในกรณีของฉันธีมแอพของเรามีandroid:windowBackgroundสีน้ำเงิน สิ่งนี้ทำให้เกิดแฟลชสีน้ำเงินในช่วงการเปลี่ยนภาพซึ่งค่อนข้างน่าผิดหวัง แต่แทนที่จะทำการเปลี่ยนแปลงที่ส่งผลกระทบต่อแอปทั้งหมดในตอนนี้ฉันกำลังใช้ตัวเลือกแรกที่รวดเร็วและสกปรก