2012-07-07 8 views
7

Tôi gặp sự cố khi thiết lập một số mục menu phân đoạn trong ActionBar và tôi đã tìm cách giải quyết nó, nhưng tôi không hiểu tại sao nó hoạt động.Sử dụng onPrepareOptionsMenu thay vì onCreateOptionsMenu trong Fragment

Tôi muốn thay đổi mức hiển thị trong mục menu ngay sau khi tôi thổi phồng nó từ một tệp xml menu trong phương thức onCreateOptionsMenu. Mã có vẻ hoạt động tốt, nhưng không có hiệu ứng rõ ràng. Tôi đã giải quyết được sự cố khi làm tăng menu trong phương thức onCreateOptionsMenu nhưng thay đổi chế độ hiển thị của phương thức theo phương pháp onPrepareOptionsMenu.

Điều tôi muốn biết là lý do thay đổi mức hiển thị trong onCreateOptionsMenu không hoạt động.

Tôi có thể làm gì trong onPrepareOptionsMenu mà tôi không thể thực hiện trong onCreateOptionsMenu?

Có mẫu nào để theo dõi ở đây không?

Cảm ơn!

Dưới đây là các mã có liên quan, chỉ trong trường hợp:

public class MyFragment extends Fragment { 

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

     // This does not work, compiles and runs fine, but has no visible effect 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 

     // This does work 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 
} 
+1

Tôi không chắc chắn, nhưng [tài liệu] (http://developer.android.com/reference/android/app/Activity. html # onCreateOptionsMenu (android.view.Menu)) cho biết: "_ ... Để cập nhật menu mỗi khi được hiển thị, hãy xem [onPrepareOptionsMenu (Menu)] (http://developer.android.com/reference/android/app/ Activity.html # onPrepareOptionsMenu (android.view.Menu)) ._ " –

+1

Cảm ơn bạn đã bình luận! Điều ở đây là tôi không cần phải 'cập nhật nó mỗi khi nó được hiển thị' (nó được hiển thị mọi lúc, không có menu phụ), tôi chỉ muốn cấu hình menu một lần, khi được tạo/tăng cao và tất cả . Được rồi, nó có vẻ giống như vậy trong tình huống của tôi nhưng điểm của câu hỏi của tôi là hiểu tại sao nó lại hoạt động như thế này. Tại sao tôi phải 'định cấu hình lại' trình đơn mỗi khi được hiển thị khi tôi chỉ có thể thực hiện một lần khi tạo? –

+0

Tôi hiểu và đồng ý rằng nên là một lựa chọn. Tuy nhiên theo ý kiến ​​của tôi, tôi nghĩ đó là cách Android hoạt động. Trong một số trường hợp, bạn có thể mã hóa các thuộc tính của trình đơn bằng các thuộc tính xml. –

Trả lời

5

Bạn nên gọi super.onCreateOptionsMenu(menu, inflater); sau khi bạn đã tạo menu của mình, không phải trước đó. Điều đó sẽ gửi trình đơn lên trong cấu trúc phân cấp và các đoạn khác hoặc hoạt động có thể muốn tự thêm các mục.

Hoạt động chịu trách nhiệm hiển thị và quản lý menu, vì vậy nếu bạn thay đổi chế độ hiển thị sau khi được gửi đến hoạt động, sẽ không có gì xảy ra nhiều.

Bây giờ, khi bạn gọi super.onPrepareOptionsMenu(menu);, nó sẽ "chuẩn bị" menu của nó, nhưng bây giờ nó sẽ thực hiện các thay đổi bạn đã thực hiện trong tài khoản onCreateOptionsMenu.

+1

đẹp - xóa dòng này vì bạn đã đúng "_I nghĩ rằng_" – Elltz

+0

Xong- cảm ơn vì đã comfirming. – Christian

0

Có thể mã nên trở thành sự thật để làm cho thực đơn có thể nhìn thấy, có nghĩa là bạn nên đặt return true; tuyên bố trong cả onCreateOptionsMenu()onPrepareOptionsMenu().

Hy vọng điều này sẽ hữu ích.

+5

onCreateOptionsMenu trả về void – Axarydax

+1

Thực ra, có hai phương thức onPrepareOptions(). [First] (http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu (android.view.Menu)), đối với lớp Activity, trả về một giá trị-- nếu đúng thì không trở lại, menu sẽ không hiển thị. Phiên bản [Fragment] (http://developer.android.com/reference/android/app/Fragment.html#onPrepareOptionsMenu (android.view.Menu)) không có. Phiên bản Fragment yêu cầu API 11 so với API 1 cho phiên bản Hoạt động. Loại thú vị. – fattire

0

Tôi sử dụng onPrepareOptionsMenu để cập nhật các mục nào trên menu sẽ hoạt động và mục nào sẽ được chuyển sang màu xám/xóa tùy thuộc vào trạng thái hiện tại của hoạt động. Sử dụng phương thức setVisible của mục menu để kiểm soát xem nó có được hiển thị trên menu hay không.

-2

này làm việc cho tôi

public class ContentFragment extends android.support.v4.app.Fragment { 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.content_frame,container,false); 
    setHasOptionsMenu(true); 
    return v; 
} 

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

Thử

+0

Điều này làm việc cho tôi nhưng muốn biết làm thế nào để sử dụng phương thức invalidateoptionsmenu() cho thay đổi động –

+0

nếu có bất kỳ mã nào liên quan đến việc cập nhật menu động thì hãy cho tôi biết. –