Ngăn chặn hoàn toàn các chuyển đổi Hoạt động can thiệp vào các chuyển tiếp phần tử được chia sẻ:
Trên hoạt động thoát, hãy gọi getWindow (). SetExitTransition (null);
Về hoạt động nhập, hãy gọi getWindow (). Set EntryTransition (null);
Từ https://stackoverflow.com/a/34907685/967131
Tôi nghi ngờ điều này có thể có tác dụng phụ, nhưng không biết chắc chắn. Nó đã chết đơn giản và làm việc mặc dù.
Ngăn chặn các yếu tố cụ thể từ nhấp nháy:
Tôi bắt đầu với câu trả lời của Alex Lockwood và đã thực hiện một chút thử nghiệm để cố gắng làm cho nó hoạt động. Cốt lõi của nó là chính xác, mặc dù tôi không cần mã mà anh ấy gợi ý cho Hoạt động nhận, nhưng tôi gặp phải một số vấn đề bằng cách gọi nó trong Đoạn (thay vì Hoạt động) và bằng cách đặt thanh công cụ làm thanh hành động.
Ồ, mảnh vỡ? Tôi thấy rất nhiều ý kiến cho rằng cố gắng truy xuất các tham chiếu đến thanh trạng thái và thanh điều hướng là null. Điều tương tự cũng xảy ra với tôi, cho đến khi tôi nhận ra tôi sẽ không tìm thấy những thứ đó trong bố cục của Mảnh vỡ ... chúng ở trên mức đó. Do đó, mã bên dưới để có được chế độ xem trang trí từ Hoạt động và tìm kiếm đó. Sau đó, tôi tìm thấy chúng không có vấn đề.
Cuối cùng, tôi đã phát triển phương pháp tiện ích này:
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();
}
Lưu ý R.string.transition_appbarlayout và R.id.appbarlayout . Các ID này là tùy ý, miễn là chúng khớp với những gì mã của bạn sử dụng. Trong XML của tôi, tôi bố trí thanh hành động tùy chỉnh như vậy (được chỉnh sửa thành các yếu tố cần thiết):
<?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>
Nếu bạn không sử dụng Thanh công cụ như thế này, phần đó có thể bị xóa khỏi phương thức tiện ích.
Sau đó, bạn sẽ gọi nó trong Fragment của bạn như vậy:
startActivity(intent, UIUtils.transitionOptions(getActivity(),
R.id.**my_view**,
R.string.**transition_my_view**));
Sử dụng bất kỳ giá trị nào bạn muốn, miễn là nó phù hợp với XML của bạn.
Điều này ngăn thanh trạng thái, thanh công cụ và thanh điều hướng (nút quay lại / nhà / ứng dụng gần đây) không nhấp nháy trong quá trình chuyển đổi. Phần còn lại của quá trình chuyển đổi Activity là bình thường.
Trong trường hợp của tôi, chủ đề ứng dụng của chúng tôi có một android:windowBackground
màu xanh. Điều này gây ra một đèn flash màu xanh trong quá trình chuyển đổi, khá khó chịu. Nhưng thay vì thực hiện một thay đổi ảnh hưởng đến toàn bộ ứng dụng như vậy, bây giờ tôi sẽ sử dụng tùy chọn đầu tiên, nhanh chóng và bẩn thỉu.