2012-12-04 29 views
15

Ngăn xếp lưng có hỗ trợ tương tác với các phân đoạn lồng nhau trong Android không?Các mảnh ghép được tổ hợp và ngăn xếp phía sau

Nếu có, tôi đang làm gì sai? Trong thực hiện của tôi, nút quay lại hoàn toàn bỏ qua thực tế là tôi đã thêm giao dịch này vào ngăn xếp lại. Tôi hy vọng nó không phải là vì một vấn đề với các mảnh lồng nhau và chỉ tôi làm một cái gì đó không chính xác.

Các mã sau đây là bên trong của một trong những mảnh vỡ của tôi và được sử dụng để trao đổi một mảnh mới với bất cứ đoạn lồng nhau hiện đang hiển thị:

 MyFragment fragment = new MyFragment(); 
    FragmentTransaction ft = getChildFragmentManager().beginTransaction(); 
    ft.setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_left, R.animator.slide_in_from_left, R.animator.slide_out_right); 
    ft.addToBackStack(null); 
    ft.replace(R.id.myFragmentHolder, fragment); 
    ft.commit(); 
+0

Bất cứ ai nhìn thấy OP này có thể mất xem xét một trang khác, http://stackoverflow.com/questions/13418436/android-4-2-back-stack-behaviour-with-nested-fragments, giải thích rõ hơn. – lcn

Trả lời

28

Tôi có cùng một vấn đề, tôi muốn mảnh vỡ tổ, và giữ một ngăn xếp lưng cho từng đoạn lồng nhau.

Nhưng ... có vẻ như trường hợp này không được thư viện hỗ trợ v4 xử lý. Trong đoạn mã FragmentActivity trong thư viện, tôi có thể tìm thấy:

public void onBackPressed() { 
    if (!mFragments.popBackStackImmediate()) { 
     finish(); 
    } 
} 

Các mFragments đại diện cho FragmentManager của hoạt động này, nhưng nó dường như không quản lý này "truyền" pop để các nhà quản lý trẻ em. Một cách giải quyết sẽ tự gọi popBackStackImmediate() trên người quản lý trẻ em, như thế này trong hoạt động kế thừa từ FragmentActivity:

private Fragment myFragmentContainer; 

    @Override 
    public void onBackPressed() { 
      if (!myFragmentContainer.getChildFragmentManager().popBackStackImmediate()) { 
       finish(); //or call the popBackStack on the container if necessary 
      } 
    } 

Có thể có một cách tốt hơn, và một cách tự động hơn, nhưng đối với nhu cầu của tôi tất cả đều ổn.

+0

Hmm Tôi sẽ chụp ảnh này sau và chấp nhận nếu nó hoạt động. – MikeS

+0

Điều này dường như không hoạt động. Thứ nhất, Fragments không có phương thức popBackStackImmediate() (chỉ FragmentManagers làm). Tôi đã thử thay thế 'this.getFragmentManager(). PopBackStackImmediate()', nhưng về cơ bản không thấy gì khác hơn những gì đã xảy ra. – MikeS

+1

Sau khi làm việc với những gì bạn đã cho tôi, tôi đã tìm ra giải pháp! Tôi sẽ chỉnh sửa câu trả lời của bạn để chứa giải pháp và đánh dấu nó như được chấp nhận khi bạn đưa tôi hầu hết cách để trả lời đúng ... – MikeS

-2
@Override 
public void onBackPressed() { 
    FragmentManager fm = getSupportFragmentManager(); 
    if (fm.getBackStackEntryCount() > 0) { 
     fm.popBackStack(); 
     return; 
    } 
    finish(); 
} 
+0

Vui lòng thêm một số giải thích về câu trả lời của bạn. – DontVoteMeDown

4

Trong dự án hiện tại của tôi, chúng tôi có nhiều "lớp lồng nhau" vì vậy tôi đã đi lên với sau workaround để tự động bật backstack chỉ dành cho các nhà quản lý hàng đầu đoạn cấp:

@Override 
public void onBackPressed() { 
    SparseArray<FragmentManager> managers = new SparseArray<>(); 
    traverseManagers(getSupportFragmentManager(), managers, 0); 
    if (managers.size() > 0) { 
     managers.valueAt(managers.size() - 1).popBackStackImmediate(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

private void traverseManagers(FragmentManager manager, SparseArray<FragmentManager> managers, int intent) { 
    if (manager.getBackStackEntryCount() > 0) { 
     managers.put(intent, manager); 
    } 
    if (manager.getFragments() == null) { 
     return; 
    } 
    for (Fragment fragment : manager.getFragments()) { 
     if (fragment != null) traverseManagers(fragment.getChildFragmentManager(), managers, intent + 1); 
    } 
} 
Các vấn đề liên quan