2011-10-19 19 views
9

Trong một Fragment, được gọi trong một hoạt động Tôi đang hiển thị một danh sách các tuyến xe buýt như thế này:Thay đổi ActionBar khi sử dụng mảnh

Page 1, when opening for the first time.

Sau đó, khi người dùng nhấp vào "trạm", tôi thích để hiển thị danh sách các trạm tất nhiên. Tôi đang sử dụng mã này:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.act_long_distance); 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.add(R.id.f_long_distance, new LongDistanceFragment()).commit(); 
} 

@SuppressWarnings({"UnusedDeclaration"}) 
public void showStationList(View view) { 
    String tag = (String) view.getTag(); 
    if (tag != null && tag.length() > 0) { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     StationListFragment fragment = new StationListFragment(tag.split(",")); 
     ft.add(R.id.f_long_distance, fragment); 
     // ft.replace(R.id.f_long_distance, fragment); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     ft.addToBackStack(null); 
     ft.commit(); 
    } 
} 

XML cho hoạt động này là:

<LinearLayout 
    android:id="@+id/ll_container" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    > 
    <FrameLayout 
     android:id="@+id/f_long_distance" 
     android:layout_weight="1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</LinearLayout> 

StationListFragment là một đơn giản ListFragment hiển thị trên đầu trang của người kia:

After clicking on the Station List button

Điều gì hoạt động tốt mặc dù là ActionBar, nó bây giờ đúng cách chứa Tiêu đề chỉ có.

Điều gì không hiệu quả nếu tôi nhấn quay lại ngay bây giờ. danh sách Trạm là ẩn, nhưng ActionBar cũ không được khôi phục:

ActionBar after coming back from List button

Các tài liệu đang nói rằng cách để thêm ActionBar đang sử dụng onCreateOptionsMenu phương pháp, vv

Vì vậy, trong LongDistanceFragment (cái đầu tiên được hiển thị), tôi đang tạo thanh như sau:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    Log.d(TAG, "onViewCreated"); 
    super.onViewCreated(view, savedInstanceState); 

    setHasOptionsMenu(true); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 

    ActionBar bar = getSupportActivity().getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
    bar.setListNavigationCallbacks(new SimpleSpinnerArrayAdapter(getActivity()), this); 
} 

Nhưng bằng cách nào đó, nó sẽ không được khôi phục khi người dùng quay trở lại đoạn đó.

Tôi nghĩ rằng cách khôi phục trạng thái của ActionBar khi quay trở lại Giao dịch phân đoạn là cần thiết.

Tôi đang thiếu gì? Cảm ơn vì bất kì sự giúp đỡ.

+0

Tôi đang chiến đấu với điều này tại thời điểm này. Đây là một câu hỏi liên quan. http://stackoverflow.com/questions/6503189/fragments-onresume-from-back-stack –

Trả lời

9

Nếu tôi hiểu mã của bạn chính xác, sự cố có thể xảy ra trong số StationListFragment của bạn.

ActionBar được liên kết với Bản thân hoạt động chứ không phải một Phân đoạn cụ thể trong đó.

Tôi đoán rằng trong StationListFragment bạn đang sửa đổi ActionBar để hiển thị tiêu đề "Kênh" và tắt chế độ Điều hướng danh sách. Trong trường hợp đó, nhấn nút quay lại sẽ hoàn tác giao dịch - loại bỏ hiệu quả StationListFragment - nhưng không tự động hoàn tác bất kỳ thay đổi nào bạn có thể đã thực hiện cho Thanh tác vụ của Hoạt động.

Điều bạn cần làm là ghi đè một trong các trình xử lý thay đổi trạng thái trong Phân đoạn danh sách trạm của bạn để hoàn tác các thay đổi ActionBar khi nó bị xóa/ẩn.

Một cách tiếp cận tốt hơn sẽ được sử dụng một giao dịch replace để trao đổi LongDistanceFragment với StationListFragment (thay vì thêm sau này trên đầu trang của cựu.) Sau đó, bạn có thể thêm mã để cấu hình Thanh tác vụ cho mỗi Fragment để họ thiết lập nó một cách thích hợp khi chúng trở nên hữu hình (bằng cách ghi đè onResume) thay vì cố gắng dọn dẹp sau khi bị loại bỏ.

+2

Không có trình xử lý thay đổi trạng thái nào trong ListFragment thực sự được gọi là do đó bạn không có cách nào để làm điều đó. Đó là một lỗi trong API. –

+1

Tôi đang sử dụng thay thế nhưng tôi đang thêm chế độ xem chi tiết vào ngăn xếp lại. Và sau đó khi nút quay được nhấn không có sự kiện nào được kích hoạt trên danh sách để có thể đặt lại tiêu đề trở lại .. –

+0

Sau đó, anh ấy thay đổi tiêu đề ActionBar ở đâu? Dựa trên mã trong mẫu này, nó sẽ không bao giờ hiển thị "Dừng dòng xe buýt" - Tôi phải giả định điều đó đang xảy ra trong StationListFragment. –

1

Tôi đã xử lý cùng một vấn đề và khi tôi hoàn nguyên các thay đổi đối với ActionBar trong phương thức onStop của Phân đoạn thứ hai, nó hoạt động tốt.

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