2012-09-20 6 views
6

Vì lý do nào đó, onCreateOptionsMenu() được gọi là SAU onResume() trong ứng dụng của tôi ... Do đó, tôi không thể giữ menu trong khi tôi đang thiết lập giao diện người dùng (giữa onCreate()onResume()). có thể thiết lập các mục tác vụ tương ứng cho ActionBar của tôi ...Làm thế nào để có được một tổ chức của menu ActionBar tại thời gian thiết lập giao diện người dùng?

Chỉ làm việc xung quanh tôi đã tìm thấy cho đến nay là tự gọi invalidateOptionsMenu() ngay trước khi trả lại onCreate(); theo cách đó, onCreateOptionsMenu() được gọi ngay lập tức, tôi nhận được một trình đơn và sau đó tôi có thể thêm các mục tác vụ mong muốn.

Có ai gặp phải sự cố này không? Làm thế nào bạn có thể lập trình thiết lập các mục hành động của bạn được đưa ra onCreateOptionsMenu() được gọi sau khi onResume()?

Ứng dụng của tôi đang chạy trên Jellybean, nó sử dụng được xây dựng trong ActionBar (không ActionBarSherlock), android:minSdkVersion="14"android:targetSdkVersion="16"

+0

Kiểm tra độ an toàn nhanh, bạn đang nói về hoạt động * onCreate & onResume, phải không? trái ngược với các phương thức tương ứng trong Fragment –

+0

Tại sao bạn không thể thiết lập các mục menu trong 'onCreateOptionsMenu()' (thay vì sử dụng nó đơn giản để lưu trữ một tham chiếu đến menu để sử dụng sau này)? – user113215

+1

Tôi có user113215 ở đây, tại sao bạn cần biết về menu trong 'onResume()'? Nó có vẻ không đúng. – dmon

Trả lời

6

Đầu tiên xem xét rằng có lẽ bạn không nên làm điều này. Có vẻ như ý tưởng của bạn có thể đi ngược lại các mẫu thiết kế điển hình cho Android. Ví dụ: nếu menu của bạn đang thay đổi để phản hồi lựa chọn người dùng, bạn nên sử dụng chế độ hành động theo ngữ cảnh.

  • Từ Action Bar API Guide:

    Theo nguyên tắc chung, tất cả các mục trong menu tùy chọn (cho phép các hành động một mình) nên có tác động toàn cầu về các ứng dụng, chứ không phải chỉ ảnh hưởng đến một phần nhỏ của giao diện. [...] Vì vậy, ngay cả trước khi quyết định liệu một mục trình đơn có xuất hiện dưới dạng mục tác vụ hay không, hãy đảm bảo rằng mục đó có phạm vi toàn cục cho hoạt động hiện tại.

  • Từ Menu API Guide:

    Bạn nên bao giờ thay đổi các mục trong trình đơn tùy chọn dựa trên hiện các View trong tiêu cự. Khi ở chế độ cảm ứng (khi người dùng không sử dụng bi xoay hoặc d-pad), chế độ xem không thể lấy tiêu điểm, do đó bạn không bao giờ nên sử dụng tiêu điểm làm cơ sở để sửa đổi các mục trong menu tùy chọn. Nếu bạn muốn cung cấp các mục menu nhạy cảm với ngữ cảnh cho một số View, hãy sử dụng Context Menu.


Chặn điều đó, nếu bạn muốn thay đổi các mục trong menu như bạn đã mô tả, bạn nên thực hiện thay đổi trong onPrepareOptionsMenu(). Khi sự kiện xảy ra, yêu cầu thay đổi các mục menu, hãy đưa thông tin liên quan vào một trường và gọi invalidateOptionsMenu(). Ghi đè onPrepareOptionsMenu() và kiểm tra giá trị của trường để xác định mục menu nào cần thêm/xóa.

(Nó cũng sẽ hoạt động để gọi invalidateOptionsMenu() và ghi đè onCreateOptionsMenu() để sửa đổi mục trình đơn nào sẽ được hiển thị, mặc dù phương pháp này không được khuyến nghị.)

Thêm từ các Menu API Guide:

Bạn nên sử dụng onCreateOptionsMenu() chỉ để tạo ra trạng thái đơn ban đầu và không thay đổi trong suốt vòng đời hoạt động. Nếu bạn muốn sửa đổi menu tùy chọn dựa trên các sự kiện xảy ra trong vòng đời hoạt động, bạn có thể làm như vậy trong phương thức onPrepareOptionsMenu().

Phương thức này chuyển cho bạn đối tượng Menu vì nó hiện đang tồn tại để bạn có thể sửa đổi nó, chẳng hạn như thêm, xóa hoặc vô hiệu hóa mục. (Những mảnh vỡ cũng cung cấp một callback onPrepareOptionsMenu().)

  • On 2.3.x Android và thấp hơn, hệ thống gọi onPrepareOptionsMenu() mỗi lần người dùng mở trình đơn tùy chọn (nhấn nút Menu).

  • Trên Android 3.0 trở lên, trình đơn tùy chọn được coi là luôn luôn là mở khi mục trình đơn được trình bày trong thanh tác vụ. Khi sự kiện xảy ra và bạn muốn thực hiện cập nhật menu, bạn phải gọi invalidateOptionsMenu() để yêu cầu hệ thống gọi onPrepareOptionsMenu().

+0

Câu trả lời tuyệt vời, cảm ơn A LOT cho đầu vào của bạn :) –