2013-04-26 28 views
9

Chúng tôi có một Hoạt động có chứa một SlidingMenu (https://github.com/jfeinstein10/SlidingMenu), trong đó có ba tùy chọn, hãy gọi chúng là A, B1, C1. Chúng tương ứng với Phân đoạn mà chúng tôi hiển thị trong Hoạt động. Khi bạn chọn một tùy chọn khác từ SlidingMenu, tôi thay thế đoạn hiện tại bằng đoạn mới thông qua FragmentManager.Xóa ngăn xếp Android Fragment trở lại mà không cần popping?

Từ đoạn B1 bạn có thể đi đến hai phần khác, hãy gọi chúng là B2 và B3. Ở đây chúng tôi muốn phím Back để đưa bạn từ B2 -> B1 hoặc từ B3 -> B1, vì vậy tôi gọi transaction.addToBackStack (null). Nếu chúng ta chọn một tùy chọn từ SlidingMenu khi bạn đang ở B2 hoặc B3, chúng tôi muốn xóa ngăn xếp lại, vì vậy tôi sử dụng mã như được đề xuất trong câu hỏi này Clear back stack using fragments gọi popBackStack() cho đến khi nó rõ ràng.

Cho đến nay rất tốt.

Từ đoạn C1, bạn có thể chuyển đến Phân đoạn C2. Vì C1/C2 có nhiều thiết kế chính/chi tiết hơn, tôi sử dụng

fragmentTransaction.setCustomAnimations(R.animator.slide_in_from_right, 
    R.animator.slide_out_to_left, R.animator.slide_in_from_left, 
    R.animator.slide_out_to_right); 

để thêm hoạt ảnh trang trình bày C1 trượt sang trái như C2 trang trình bày từ bên phải và ngược lại. Nhấn phím Back trong khi trên C2 đưa chúng ta trở lại C1, với các hình ảnh động ngược lại, và tất cả là tốt.

NHƯNG

Nếu bạn chọn A hoặc B1 từ SlidingMenu và chúng tôi popBackStack() để thoát khỏi C1 từ ngăn xếp trở lại, sau đó nó trượt C2 ra ở bên phải, trông lạ. Những gì tôi muốn làm là xóa ngăn xếp lại mà không chạy hoạt ảnh, nhưng tôi không thể tìm được cách để làm điều đó. Tôi đã thử gọi popBackStackImmediate() thay vào đó, nhưng điều đó dường như không tạo ra bất kỳ sự khác biệt nào. Thay vào đó, tôi đoán tôi có thể tránh gọi addToBackStack, và thay vào đó tự tay xử lý người dùng nhấn phím Quay lại thông qua Activity.onBackPressed(), nhưng có lẽ có một giải pháp mà tôi không thể nhìn thấy?

Trả lời

6

Bạn có thể thử tiếp theo, mặc dù tôi không quen với .remove() có vẻ như nó nên làm những gì bạn muốn:

myFragmentClass myFragC1 = (myFragmentClass) getFragmentManager().findFragmentByTag("theTagYouUsedWhenAddingToBackStack"); 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.remove(myFragC1); 
transaction.commit(); 
+0

Điều đó dường như làm chính xác những gì tôi cần. Cảm ơn! –

+0

@JonathanCaryl Tuyệt vời! Tôi vui vì nó hoạt động như tôi đã không thực sự chắc chắn 100% nó sẽ :) – TronicZomB

+0

Không làm việc cho tôi với thư viện hỗ trợ v23.1.1 –

3

Đáng buồn thay, tôi không biết làm thế nào để làm cho nó một cách chính xác vì vậy đây là giải pháp của tôi (thực sự tôi đã khá sửa đổi stackoverflow khác answer)

Trong lớp mảnh cơ sở được mở rộng bởi tất cả các mảnh vỡ khác):

public static boolean sDisableExitAnimation = false; 

@Override 
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { 
    if (sDisableExitAnimation && !enter) { 
     return AnimationUtils.loadAnimation(getActivity(), R.anim.clear_stack_exit); 
    } 
    return super.onCreateAnimation(transit, enter, nextAnim); 
} 

Để xóa chồng bạn cần phải gọi:

ScreenFragment.sDisableExitAnimation = true; 
manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 

Và cuối cùng clear_stack_exit hoạt hình riêng của mình (tôi không tìm thấy một cách để có được nó từ FragmentManager tự):

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 

    <alpha 
     android:fromAlpha="1" 
     android:toAlpha="0" 
     android:duration="220" 
     /> 

    <scale 
     android:fromXScale="1" 
     android:toXScale="0.975" 
     android:fromYScale="1" 
     android:toYScale="0.975" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:duration="220" 
     /> 

</set> 

Bằng cách này bạn' sẽ có hoạt hình ngăn xếp rõ ràng chính xác. Chỉ cần đừng quên xóa biến sDisableExitAnimation trước khi bắt đầu quá trình chuyển đổi tiếp theo.

+0

Cảm ơn bạn rất nhiều, nó hoạt động tuyệt vời –

Các vấn đề liên quan