Android - Hoạt ảnh tùy chỉnh trên giao dịch phân mảnh không chạy


83

Tôi đang sử dụng Google API 8 (Android 2.2) với gói hỗ trợ v4.

Nó không đưa ra bất kỳ lỗi hoặc hoạt ảnh nào.

Giao dịch:

FragmentTransaction transaction = manager.beginTransaction();       
transaction.replace(R.id.content, myFragment);
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.commit();

Ảnh động:

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="700"
        android:fromXDelta="-100%"
        android:toXDelta="0%" >
    </translate>
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="700"
        android:fromXDelta="0%"
        android:toXDelta="100%" >
    </translate>
</set>

Có ai biết những gì đang xảy ra ở đây?


1
Các phân đoạn đã không được giới thiệu cho đến Honeycomb (API 11, Android 3.0). Đó có thể là vấn đề, nhưng tôi nghĩ Eclipse sẽ cho bạn biết.
Steve Blackwell

6
Đó là lý do tại sao tôi đang sử dụng gói hỗ trợ.
adheus

Câu trả lời:


256

Người quản lý đã xếp chồng giao dịch của tôi trước khi tôi đặt hoạt ảnh, vì vậy nó sẽ xếp giao dịch không có hoạt ảnh (buồn nhưng đúng) và điều đó xảy ra ngay cả khi tôi thực hiện giao dịch sau setCustomAnimations().

Giải pháp là đặt các hoạt ảnh trước:

FragmentTransaction transaction = manager.beginTransaction();       
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.replace(R.id.content, myFragment);
transaction.commit();

vì vậy bạn phải tách câu lệnh để tránh bị lừa đối tượng tự trả về
sherpya

4
transaction.something().somethingelse().replace().commit(), Nhiều phương pháp android trở lại this, do đó bạn có thể tránh gõ lại biến, nhưng bằng cách nào đó ở đây cho thấy một tác dụng phụ và setCustomAnimations()nên được gọi riêng
sherpya

44
Chỉ cần lưu ý, "tự trở đối tượng lừa" được gọi là "phương pháp chaining"
Egor

Phương thức chuỗi cuộc gọi ở trên chắc chắn hoạt động. Chỉ cần thử nghiệm nó trong dự án của riêng tôi.
MawrCoffeePls

Ngoài ra, để tạo hoạt ảnh cho phân đoạn khi bật từ ngăn xếp trở lại, hãy sử dụng transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);thay thế.
Justin

23

Như đã đề xuất ở trên, các câu lệnh riêng biệt chắc chắn sẽ hoạt động. Nhưng mẹo ở đâysetCustomAnimationtrước khi thiết lập loại giao dịch viz. add, replacev.v ... khác thì không. Vì vậy, áp dụng cùng một logic, method chainingcũng hoạt động. ví dụ.

getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations(R.anim.a_slide_up,
                             R.anim.a_slide_down,
                             R.anim.a_slide_up,
                             R.anim.a_slide_down)
        .add(R.id.root_layout, 
             MyFrag.newInstance())
        .addToBackStack("MyFrag")
        .commit();

Đặt nó ở đây, để ai đó thích method chainingthấy nó hữu ích. Chúc mừng!


1
Tôi hơi khó chịu với cách bạn sử dụng toán tử 'dấu chấm' cho chuỗi phương thức.
Shaishav

1
Đồng ý @Shaishav, đã viết câu trả lời này hai năm trước, đang cập nhật nó .. Cảm ơn!
Harisewak

7

Để đây là câu hỏi phổ biến nhất. Tôi đã gặp vấn đề tương tự với giao dịch phân mảnh không hoạt động. Thủ phạm đã android:animateLayoutChangesđặt thuộc tính thành truetrong bố cục chứa.

Tôi hy vọng nó sẽ giúp ai đó tiết kiệm thời gian tìm kiếm giải pháp vì có thể khó nhận thấy khi có bố cục lồng nhau trong các tệp khác nhau.


Hoạt ảnh hiện đang hoạt động nhưng vấn đề mới - đó là hành vi hoạt ảnh đã thay đổi. trước khi nó trượt ngang (như mong đợi). hiện đang mở rộng từ góc
Sharad Kale

0

Một lý do khác có thể được đặt fragmentTransaction.show()trước khi cam kết một cách không cần thiết . Điều này làm cho chuyển đổi cửa sổ bật lên không hiển thị trên một số phiên bản API Android.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.