2013-08-14 37 views
6

Tôi đang cố gắng hiển thị/ẩn các mục trong thanh tác vụ tùy thuộc vào phân đoạn nào hiển thị.Thay đổi trạng thái menu của thanh tác vụ tùy thuộc vào đoạn

Trong MainActivity của tôi, tôi đã sau

/* Called whenever invalidateOptionsMenu() is called */ 
@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 

    if(this.myFragment.isVisible()){ 
     menu.findItem(R.id.action_read).setVisible(true); 
    }else{ 
     menu.findItem(R.id.action_read).setVisible(false); 
    } 

    return super.onPrepareOptionsMenu(menu); 
} 

này hoạt động tuyệt vời tuy nhiên, khi xoay thiết bị có một vấn đề. Sau khi quay hoàn thành onPrepareOptionsMenu được gọi lại tuy nhiên thời gian này this.myFragment.isVisible() trả về false ... và do đó mục trình đơn bị ẩn khi rõ ràng đoạn có thể nhìn thấy (như xa như hiển thị trên màn hình).

+0

Bạn không chắc chắn nhưng bạn đang sử dụng cùng một đoạn cho cả chế độ dọc và ngang hoặc bạn thêm một số đoạn khác cũng như ở chế độ ngang? Khi xoay vòng khi nó khởi tạo lại chính nó là bạn chắc chắn nó đang được gắn vào FragmentActivity. Bạn có thể kiểm tra điều này bằng cách sử dụng fragment.isAdded()? –

+0

Có, trong phương thức onCreate tôi làm: this.myFragment = new MyListFragment(); và sau đó this.myFragment được tham chiếu thông qua hoạt động –

Trả lời

-3

Chỉnh sửa: Đây là bản sửa lỗi nhanh và bẩn, xem es0329's answer bên dưới để có giải pháp tốt hơn.

Hãy thử thêm thuộc tính này để thẻ activity của bạn trong manifest Android của bạn:

android:configChanges="orientation|screenSize" 
+0

Cảm ơn, hoàn hảo –

+2

Tôi tự hỏi liệu các nhà phát triển Android có bao giờ có thể từ bỏ quy ước này không. Các giải pháp khác được đăng ở đây là tốt hơn nhiều. –

+0

Lần đầu tiên tôi thấy câu trả lời được chấp nhận với số phiếu bầu giảm. LOL !!! –

0

Hãy thử sử dụng Fragment của setRetainInstance(true); khi mảnh của bạn được gắn vào hoạt động. Bằng cách đó, mảnh của bạn sẽ giữ nguyên giá trị hiện tại của nó và gọi vòng đời khi thiết bị xoay.

24

Dựa trên Fragments API Guide, chúng ta có thể thêm các mục vào thanh tác vụ trên một cơ sở cho mỗi Fragment với các bước sau: Tạo một res/menu/fooFragmentMenu.xml có chứa các mục menu như bình thường cho menu tiêu chuẩn.

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item 
     android:id="@+id/newAction" 
     android:orderInCategory="1" 
     android:showAsAction="always" 
     android:title="@string/newActionTitle" 
     android:icon="@drawable/newActionIcon"/> 
</menu> 

Hướng tới phía trên cùng của phương pháp onCreate FooFragment của, chỉ ra rằng nó có mục menu riêng của mình để thêm.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
    ... 
} 

Override onCreateOptionsMenu, nơi bạn sẽ thổi phồng menu của đoạn và gắn nó vào thực đơn tiêu chuẩn của bạn.

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

Override onOptionItemSelected trong đoạn của bạn, mà chỉ được gọi khi phương pháp này cùng của hoạt động máy chủ/FragmentActivity thấy rằng nó không có một trường hợp để lựa chọn.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
     case R.id.newAction: 
      ... 
      break; 
    } 
    return super.onOptionsItemSelected(item); 
} 
+0

Rực rỡ. Cảm ơn. –

+0

Sau đó, chúng tôi có thể cung cấp điều hướng nút quay lại/lên như thế nào? –

+0

Có thể bạn là thành viên nhóm Google Android. Rất chúa! –

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