ป้องกันการเปลี่ยนกิจกรรมโดยสิ้นเชิงจากการรบกวนการเปลี่ยนองค์ประกอบที่แบ่งใช้:
ในกิจกรรมการออกให้เรียก 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
สีน้ำเงิน สิ่งนี้ทำให้เกิดแฟลชสีน้ำเงินในช่วงการเปลี่ยนภาพซึ่งค่อนข้างน่าผิดหวัง แต่แทนที่จะทำการเปลี่ยนแปลงที่ส่งผลกระทบต่อแอปทั้งหมดในตอนนี้ฉันกำลังใช้ตัวเลือกแรกที่รวดเร็วและสกปรก