2012-04-03 20 views
8

Tôi có hoạt động với ngăn kép: danh sách các mục menu bên trái (đoạn M) và chi tiết của mục hiện được chọn ở bên phải (đoạn D).Android onConfigurationChanged: làm thế nào để lưu và khôi phục lại phân đoạn ngăn xếp?

Khi người dùng chọn một mục trong đoạn D, đoạn D được thay thế bằng một đoạn khác (hãy gọi nó là D1). Khi người dùng chọn một mục trong đoạn D1, đoạn D1 được thay thế bằng một đoạn khác (hãy gọi nó là D2), v.v. Tất nhiên, khi người dùng nhấn nút quay lại, cô có thể quay trở lại trong lịch sử phân đoạn: D2-> D1-> D.

Vấn đề của tôi là: làm thế nào tôi có thể lưu và khôi phục lại ngăn xếp phân mảnh đầy đủ khi thay đổi cấu hình (đặc biệt, khi định hướng màn hình)?

Có vẻ như rất lạ đối với tôi rằng không có ai khác gặp vấn đề này trước đây, nhưng tôi không tìm thấy bất kỳ điều gì về điều này trong các tìm kiếm của tôi trên Google và Stack Overflow. Nếu tôi bỏ lỡ bất kỳ bài đăng nào có liên quan, vui lòng liên hệ với tôi.

Tôi biết rằng tôi có thể chỉ cần thêm thuộc tính android:configChanges="orientation|screenSize" vào hoạt động của mình để tránh hoạt động giải trí, nhưng tôi không thể làm điều đó.

Lý do tôi không thể làm điều đó là tôi đang sử dụng Action Bar Sherlock (vers. 4) để tương thích ngược và thành phần đó cần hoạt động giải trí để hoạt động chính xác khi thay đổi cấu hình, AFAIK.

Nếu có một cách khác để tạo lại thành phần Hành động Bar Sherlock mà không phá hủy và tạo lại hoạt động, vui lòng cho tôi biết.

Xin cảm ơn trước.

Trả lời

0

Thanh hành động Sherlock (ABS) cần thiết để tạo lại thanh hành động như là một phần của việc tái tạo hoạt động trong ABS 3.x, nhưng theo @Jake Wharton's comment, phiên bản 4 không cần giải trí - nó có thể xử lý các thay đổi định hướng. Vì vậy, hãy đặt android: configChanges = "orientation" và ngăn xếp phân đoạn của bạn sẽ vẫn tồn tại.

+1

@ Iarham1 Cảm ơn bạn đã trả lời, nhưng không may, ABS 4 vẫn có một số vấn đề trên một số phiên bản hệ điều hành (ví dụ 2.3.7) khi thiết lập android: configChanges = "orientation" như được mô tả trong [issue # 279] (https://github.com/JakeWharton/ActionBarSherlock/issues/279#issuecomment-4934511), vì vậy đây không phải là giải pháp khả thi, hiện tại. Tôi hy vọng rằng Jake Wharton sẽ sửa chữa nó trong tương lai gần, nhưng, trong khi chờ đợi, bạn hoặc bất cứ ai khác biết làm thế nào để lưu và khôi phục lại ngăn xếp đầy đủ mảnh sau khi thay đổi cấu hình? Hoặc cách khác để tinh chỉnh mã ABS để lập trình tái tạo chỉ ABS trên thay đổi cấu hình? – Luke

5

Tôi đã có thể thực hiện việc này bằng cách lưu vào bộ nhớ đệm khi tôi thêm chúng vào ArrayList của riêng tôi. Sau đó, tôi thiết lập một OnBackStackChangedListener để theo dõi cái nào được hiển thị và bật ra ArrayList khi cần thiết.

Mục đích của tôi hơi khác một chút nhưng mã bên dưới phải là thứ bạn cần cho những gì bạn mô tả. Các thẻ là để bạn có thể có nhiều ngăn xếp lại nếu bạn cần. Nó sẽ không biên dịch như là (tôi đã cắt rất nhiều mã của riêng tôi) nhưng nên cung cấp cho bạn một ý tưởng về cách tôi đã làm nó. Tuyên bố từ chối trách nhiệm bổ sung: Tôi chỉ cần làm việc này và có thể có vấn đề mà tôi chưa gặp phải.

public void replaceFragmentWithBackStackForTag(Fragment fragment, String tag) 
    { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.detach(visibleFragment); 
     ft.add(R.id.realtabcontent, fragment, tag); 
     ft.attach(fragment); 
     ft.addToBackStack(null); 
     manualBackStacks.get(tag).add(fragment); 
     ft.commit(); 
     this.getSupportFragmentManager().executePendingTransactions(); 
    } 

Mã này bạn sẽ muốn nơi hoạt động của bạn được tái tạo sau khi một sự thay đổi định hướng:

ArrayList<Fragment> backStack = 
     new ArrayList<Fragment>(manualBackStacks.get(tag)); 
popArrayListToIndex(manualBackStacks.get(tag), 0); // helper I wrote 
for (int bs = 1; bs < backStack.size(); bs++) { 
    replaceFragmentWithBackStackForTag(backStack.get(bs), tag); 
} 

Các backstack nghe:

public void onBackStackChanged() { 
    int index = getSupportFragmentManager().getBackStackEntryCount(); 
    ArrayList<Fragment> backStack = manualBackStacks.get(tag); 
    visibleFragment = backStack.get(index); 
    // Pop the last element if we've backed up. 
    popArrayListToIndex(backStack, index); 
} 

Hope this helps.

+0

Tôi rất quan tâm đến cách tiếp cận này, nhưng tôi không cảm thấy rằng câu trả lời của bạn cung cấp đủ chi tiết để tôi dễ hiểu. bạn có thể thêm chi tiết hơn vào câu trả lời của bạn không? – deepwinter

+0

Tìm hiểu điều này, cảm ơn! – deepwinter