2011-07-22 48 views
9

Làm cách nào để thay đổi menu tùy chọn tại thời gian chạy trong android 2.3.3? Tôi có hai menu xml và cần phải chuyển đổi loại menu lúc chạy.Thay đổi menu tại thời gian chạy

Tôi muốn hủy hoặc cập nhật menu và khi người dùng nhấn nút menu, menu onCreateOptions sau đó được gọi lại, chọn menu xml phù hợp.

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    if(OPTIONS_TYPE == 0) // Photo option 
     getMenuInflater().inflate(R.menu.photomenu, menu); 
    else // Photo + delete option 
     getMenuInflater().inflate(R.menu.photodeletemenu, menu); 

    return super.onCreateOptionsMenu(menu); 
} 
+0

Tôi không thấy vấn đề trong mã của bạn ... Nên hoạt động ..., có thể sự cố trong tệp xml của bạn? – Jim

+0

Kiểm tra cả hai tệp xml của bạn, có thể có giống nhau không? Và bạn nghĩ rằng bạn mã không hoạt động ... – Jim

+0

Nhưng onCreateOptionsMenu chỉ được gọi một lần. tức là khi người dùng nhấn nút tùy chọn đầu tiên – Arcadia

Trả lời

7

Chỉ onCreateOptionsMenu được gọi một lần. Có thể có một hack mà cho phép bạn loại bỏ một menu tùy chọn, nhưng cách tiêu chuẩn để sửa đổi nó sau khi gọi đó là như sau từ các tài liệu android, lưu ý rằng nó nói "phải"

Thay đổi các mục menu trong thời gian chạy

Khi hoạt động được tạo, phương thức onCreateOptionsMenu() chỉ được gọi một lần, như được mô tả ở trên. Hệ thống giữ và sử dụng lại Menu bạn định nghĩa trong phương thức này cho đến khi hoạt động của bạn bị hủy. Nếu bạn muốn thay đổi Menu Tùy chọn bất kỳ lúc nào sau khi được tạo lần đầu tiên, bạn phải ghi đè phương thức onPrepareOptionsMenu().

Documentation là Creating Menus

Bây giờ có nói rằng bạn có thể làm điều này, chỉ cần không chắc chắn nếu nó được hỗ trợ. Đây chỉ là mã thử nghiệm của riêng tôi, nơi tôi trao đổi các menu mỗi lần, bạn sẽ cần phải thêm logic của riêng mình

@Override 
public boolean onPrepareOptionsMenu (Menu menu) { 

    menu.clear(); 

    if (OPTIONS_TYPE == 0) { 
     OPTIONS_TYPE = 1; 
     getMenuInflater().inflate(R.menu.secondmenu, menu); 

    } 
    else { // Photo + delete option { 
     OPTIONS_TYPE = 0; 
     getMenuInflater().inflate(R.menu.firstmenu, menu); 
    } 

    return super.onPrepareOptionsMenu(menu); 
} 
+0

vâng tôi đã đọc điều này .. nhưng tôi phải làm gì trong onPrepareOptionsMenu? – Arcadia

+1

Tôi có nghĩa là tôi không thể sử dụng invalidateOptionsMenu() vì đây là chỉ cho android 3.0 và cao hơn; ( – Arcadia

+0

Vấn đề này được giải quyết .. Tôi giải quyết nó bằng cách ghi đè onPrepareOptionsMenu(), gọi menu.clear() và sau đó dán mã trong onCreateOptionsMenu :) – Arcadia

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