2012-05-14 18 views
34

Trong một số phương thức hoạt động của tôi, tôi muốn kiểm tra tiêu đề của menu hoặc biết nó có được kiểm tra hay không. Làm thế nào tôi có thể nhận được menu của Activity. Tôi cần một cái gì đó như this.getMenu()Làm cách nào để có được menu tùy chọn của Hoạt động của tôi?

+1

"Tên" và "Đã kiểm tra"? Tôi không hiểu. Id và sở thích? – keyser

+0

bạn đang nói về menu tùy chọn? Giống như cái được tạo trong "boolean onCreateOptionsMenu công khai (Menu trình đơn)"? – MikeIsrael

+0

trình đơn tùy chọn có – breceivemail

Trả lời

90

Hãy cảnh giác với invalidateOptionsMenu(). Nó tạo lại toàn bộ menu. Điều này có rất nhiều chi phí và sẽ thiết lập lại các thành phần nhúng như SearchView. Tôi mất khá nhiều thời gian để theo dõi lý do tại sao SearchView của tôi sẽ "đóng" ngẫu nhiên.

Tôi đã kết thúc việc chụp menu như được đăng bởi Dark và sau đó gọi onPrepareOptionsMenu(Menu) nếu cần. Điều này đáp ứng yêu cầu của tôi mà không có một tác dụng phụ khó chịu. Gotcha: Hãy chắc chắn để làm một kiểm tra null trong trường hợp bạn gọi onPrepareOptionsMenu() trước khi trình đơn được tạo ra. Tôi đã làm như sau:

private Menu mOptionsMenu; 

@Override 
public boolean onCreateOptionsMenu(final Menu menu) { 
    mOptionsMenu = menu 
    ... 
} 

private void updateOptionsMenu() { 
    if (mOptionsMenu != null) { 
     onPrepareOptionsMenu(mOptionsMenu); 
    } 
} 
+6

Đây là câu trả lời hay và tôi muốn giúp bạn nhận được 50.--) –

+0

Câu trả lời thú vị, Vì một lý do nào đó tôi không thể tìm ra menu nào để chuyển tới onPrepareOptionsMenu () vì tôi muốn thay đổi tùy thuộc vào các điều kiện chỉ xảy ra khi dịch vụ của tôi bắt đầu, v.v.Dù sao –

+0

Tôi sẽ đồng ý rằng chi phí là một chút quá nhiều và rất đáng chú ý nếu sử dụng 'invalidateOptionsMenu()'. Tôi thích giải pháp này để sử dụng ít khối lượng công việc hơn. –

1

Có một số phương thức gọi lại cung cấp menu làm thông số.

Bạn có thể muốn thao tác ở đó.

Ví dụ:

onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 
onCreateOptionsMenu(Menu menu) 
onCreatePanelMenu(int featureId, Menu menu) 

Có nhiều hơn, tốt nhất bạn hãy xem trong tài liệu hướng dẫn hoạt động và tìm kiếm phương pháp mong muốn của bạn: http://developer.android.com/reference/android/app/Activity.html

+0

trong giá trị giải pháp của bạn không được cập nhật – breceivemail

+0

không biết chính xác behaivior nhưng bạn có nghĩ rằng tiết kiệm tham chiếu trong một biến trường sẽ làm điều đó? Giống như: onCreateOptionsMenu (Menu menu) {this.menu = menu. . . . và truy cập nó yêu cầu tiêu đề sau? – Ostkontentitan

1

Theo như tôi có thể hiểu được những gì bạn muốn ở đây là có thể giúp bạn:

1. Tham khảo hướng dẫn này qua option menu.

2. Mỗi lần người dùng nhấn nút menu, bạn có thể kiểm tra tiêu đề của nó thông qua getTitle().

3. Hoặc nếu bạn muốn biết mục menu cuối cùng được chọn hoặc được chọn khi người dùng chưa nhấn nút menu thì bạn cần lưu trữ tùy chọn khi người dùng nhấn.

11

bạn có thể làm điều đó bằng cách thông qua các đối tượng Menu để lớp hoạt động của bạn

public class MainActivity extends Activity 
{ 
    ... 
    ... 
    private Menu _menu = null; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     _menu = menu; 
     return true; 
    } 

    private Menu getMenu() 
    { 
     //use it like this 
     return _menu; 
    } 
} 
+1

Gọi invalidateOptionsMenu() là tốt hơn! và bạn chỉ cần cung cấp bản cập nhật của mình trong phương thức onPrepareOptionsMenu (trình đơn Menu). – AntoineP

27

Gọi invalidateOptionsMenu() thay vì đi qua đối tượng đơn xung quanh.

+4

Thật không may, được thêm vào ở cấp API 11: ( – greg7gkb

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