2012-02-09 28 views
33

enter image description hereAndroid Xóa Phân đoạn và Chế độ xem từ BackStack

Tôi nhận thấy câu hỏi này đã được hỏi trước khi các câu trả lời trước đây đã nhận được tôi cho đến thời điểm này. Kịch bản như sau: chúng tôi có một đoạn bảng điều khiển (A), dẫn người dùng đến màn hình đăng nhập (B). Khi đăng nhập thành công, họ đi đến một listview (c). Trên backpress tôi muốn quay trở lại A, vì người dùng sẽ không cần phải nhìn thấy màn hình đăng nhập nữa. Ngoài việc đăng nhập thành công, chúng tôi lưu trữ các chi tiết trong các tùy chọn được chia sẻ và tự động đăng nhập vào B lần tới, tất cả đều hoạt động như kế hoạch.

tôi có phương pháp FragmentHelper sau:

public static void goToNextFragement(Fragment fragment, int container, boolean addToBackStack, Fragment ctx) 
    { 
     // Create new fragment and transaction 
     FragmentTransaction transaction = ctx.getSupportFragmentManager().beginTransaction(); 
     transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); 
     // Replace whatever is in the fragment_container view with this fragment, 
     // and add the transaction to the back stack 
     transaction.replace(container, fragment); 

     if(addToBackStack) 
      transaction.addToBackStack(null); 

     // Commit the transaction 
     transaction.commit(); 
    } 

Trong giao dịch từ B đến C tôi đặt Boolean addToBackStack như sai để các transaction.addToBackStack(null); không được gọi. Điều này một lần nữa hoạt động tốt nhưng sau đó là nơi mà vấn đề của tôi bắt đầu.

Khi người dùng nhấn trở lại trên C và lợi nhuận đến A tôi vẫn có thể thấy quan điểm lạm phát của C dưới quan điểm của A.

Bất kỳ trợ giúp sẽ được đánh giá cao. Tôi hy vọng sơ đồ của tôi giúp giữ cho điều này đơn giản.

Trả lời

1

Couple cách để xử lý này:

  1. Tôi đã có một dòng chảy tương tự trong ứng dụng của tôi và cách tôi giải quyết nó bằng cách thay thế đoạn đăng nhập với một AlertDialog đó là sa thải từ hoạt động chính. Vì vậy, trong trường hợp của bạn, đoạn A xuất hiện trên màn hình và nếu hoạt động chính cho rằng nó cần hiển thị hộp thoại đăng nhập, nó sẽ hiển thị AlertDialog. Điều này làm việc cho tôi.

  2. Khi đoạn A được bật, nó có thể kiểm tra xem đoạn C có nằm xung quanh không bằng cách hỏi Trình quản lý phân đoạn. Nếu nó tồn tại sau đó loại bỏ nó.

+0

AlertDialogue là con đường để đi. Cảm ơn vì đã chia sẽ kinh nghiệm của bạn. –

+16

Đây là một giải pháp thay thế không phải là giải pháp thực sự, phải không? – Brian

+2

câu trả lời này là không thể chấp nhận được –

0

Không nói với FM rằng bạn muốn chuyển từ B sang C được thêm vào backStack có nghĩa là khi bạn nhấn trở lại, FM không có bản ghi thêm C, vì vậy nó không loại bỏ nó.

+0

OK Tôi nghĩ rằng có lẽ trường hợp, tuy nhiên (có nguy cơ nghe vô ơn vì sự giúp đỡ, mà tôi không) điều này là cung cấp một phân tích của vấn đề và không phải là giải pháp. Bạn có bất kỳ ý tưởng để làm việc xung quanh/sửa lỗi này? –

+0

Tắt đầu của tôi, bạn có thể xóa phân đoạn đó theo cách thủ công, nhưng điều đó có lẽ không phải là tùy chọn tốt nhất. Ngoài ra, bạn sẽ phải làm bài tập về nhà của riêng bạn. –

21

tôi giải quyết này .. trong một dòng ...

getFragmentManager().popBackStack(); 

hoặc

getSupportFragmentManager().popBackStack() 

làm việc này khi bạn đang thêm mảnh vỡ và duy trì backstack (không thay thế).

+0

câu trả lời thực sự, nhờ –

+1

Khi bạn bật backstack trước khi đi từ 2 đến 3 hệ thống cố gắng hiển thị đoạn 1. Mỗi khi bạn bật số mảnh N, nó sẽ hiển thị số mảnh (N-1). Và nếu bạn buộc phải đi đến đoạn 3 bạn sẽ nhận được NPE trong khi onCreateView của 1 đoạn ... – Yazon2006

6

f1 -> f2

Fragment2 f2 = new Fragment2(); 
this.getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.main_content,f2).addToBackStack(null).commit(); 

gì khác thường ở đây. Hơn trong đoạn f2 mã này sẽ đưa bạn đến đoạn f3.

f2 -> f3

Fragment3 f3 = new Fragment3(); 
getActivity().getSupportFragmentManager().popBackStack(); 
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.main_content, f3).addToBackStack(null).commit(); 

Tôi không chắc chắn bằng cách đọc tài liệu nếu điều này nên làm việc, phương thức giao dịch poping này được cho là không đồng bộ, và có thể là một cách tốt hơn sẽ được gọi popBackStackImmediate() . Nhưng đến nay tôi có thể nói trên các thiết bị của tôi nó hoạt động hoàn hảo.

cho biết thay thế sẽ là:

final FragmentActivity activity = getActivity(); 
activity.getSupportFragmentManager().popBackStackImmediate(); 
activity.getSupportFragmentManager().beginTransaction().replace(R.id.main_content, f3).addToBackStack(null).commit(); 

Ở đây có thực sự sẽ ngắn gọn sẽ trở lại f1 beofre chuyển sang f3, do đó, một trục trặc nhỏ ở đó.

Điều này thực sự là tất cả những gì bạn phải làm và answer này cũng có thể giúp bạn rất nhiều ..

+0

giải pháp của bạn là rất rất hoàn hảo cho vấn đề của tôi, bạn tiết kiệm thời gian của tôi Nepster. –

0

Bước 1: Khi bạn đang ở Fragment A và muốn mở Fragment B

getFragmentManager().beginTransaction() 
.replace(android.R.id.content, new FragmentB(), FragmentB.class.getName() 
.addToBackStack(null) 
.commit(); 

Bước 2: Khi bạn đang ở Fragment B, và muốn mở Fragment C

getFragmentManager().beginTransaction() 
.replace(android.R.id.content, new FragmentC(), FragmentC.class.getName() 
.disallowAddToBackStack() // << this to make Fragment B, not included in the backstack 
.commit(); 

Bước 3: Khi you'in trong Fragment C, và thiết bị nhấn nút quay lại hoặc getFragmentManager().popBackStack(); bạn sẽ mở Fragment A.

PS: Trong hoạt động sử dụng số getSupportFragmentManager() này. Nếu bạn đang sử dụng Fragment, hãy sử dụng getFragmentManager()

0

Xin chào, tôi chỉ muốn chia sẻ giải pháp thanh lịch mà tôi đã tìm thấy.

public static void performNoBackStackTransaction(FragmentManager fragmentManager, String tag, Fragment fragment) { 
final int newBackStackLength = fragmentManager.getBackStackEntryCount() +1; 

fragmentManager.beginTransaction() 
    .replace(R.id.content, fragment, tag) 
    .addToBackStack(tag) 
    .commit(); 

fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
    @Override 
    public void onBackStackChanged() { 
    int nowCount = fragmentManager.getBackStackEntryCount(); 
    if (newBackStackLength != nowCount) { 
     // we don't really care if going back or forward. we already performed the logic here. 
     fragmentManager.removeOnBackStackChangedListener(this); 

     if (newBackStackLength > nowCount) { // user pressed back 
     fragmentManager.popBackStackImmediate(); 
     } 
    } 
    } 
}); 
} 

Source with explained logic.

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