2011-11-14 32 views
6

Có cách nào thuận tiện để hiển thị cùng các tùy chọn menu Tùy chọn trong nhiều Hoạt động không?Mã menu tùy chọn sử dụng lại

Ví dụ: Trong ứng dụng của tôi, tôi hiển thị Hướng dẫn bằng TV theo một trong ba cách.

  1. Bảy dẫn ngày (TabActivity với 7 tab)
  2. Tất cả các kênh 'Bây giờ thấy' (ListActivity)
  3. Tất cả các chương trình ngày hôm nay bởi thời gian bắt đầu (Hoạt động - có thể thay đổi một cách dễ dàng để ListActivity)

Đối Options menu trong TabActivity, mã này là khá đơn giản ...

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    menu.clear(); 
    inflater.inflate(R.menu.gv_options_menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.view: 
     ... 
    ... 
    } 
} 

... b ut tại thời điểm này có vẻ như tôi cần phải sao chép/dán nó vào hai hoạt động khác mà tôi không thích làm. Nếu tôi thay đổi mã trình đơn Tùy chọn cho một cái tôi cũng cần phải làm điều đó cho hai cái còn lại.

Cách thay thế duy nhất tôi có thể nghĩ là tôi có một lớp 'trợ giúp' (POJO) mà tôi có thể thêm phương pháp và chuyển số context vào để cho phép sử dụng phương pháp getMenuInflator() và phương pháp khác tôi có thể chuyển kết quả item.getItemId() vào để xử lý với trường hợp chuyển đổi.

Cách thông thường để có nhiều Hoạt động có cùng menu Tùy chọn là gì?

Trả lời

5

Một cách tiếp cận là sử dụng kế thừa với Hoạt động của bạn. Tạo một Activity cơ bản để thực hiện các phương thức menu tùy chọn và sau đó mỗi Activity con sẽ nhận được chức năng đó. Đây là recommended approach vào nhà phát triển trang web Android:

Mẹo: Nếu ứng dụng của bạn có chứa nhiều hoạt động và một số trong số họ cung cấp các tùy chọn tương tự Menu, hãy cân nhắc tạo một hoạt động mà thực hiện không có gì ngoại trừ onCreateOptionsMenu() và onOptionsItemSelected() phương pháp. Sau đó, mở rộng lớp này cho mỗi hoạt động sẽ chia sẻ cùng một Menu Tùy chọn. Bằng cách này, bạn phải quản lý chỉ một bộ mã để xử lý các hành động menu và mỗi lớp con thừa hưởng các hành vi menu.

Thật không may điều này sẽ không hiệu quả với bạn vì bạn không được kế thừa từ Hoạt động nhưng khác với phân lớp của nó, nhưng đó là cách 'bình thường' để thực hiện.

+0

Khi hóa ra tôi đã quên rằng nội dung tab của Hướng dẫn hoạt động 7 ngày thực sự là ListActivitys - Tôi đã thay đổi hoạt động 'tất cả các hoạt động hôm nay ...' (số 3 trong câu hỏi của tôi) cũng là một ListActivity và đã định nghĩa một lớp cơ sở mà cả ba lớp đều mở rộng. Một trong những khoảnh khắc không thể nhìn thấy rừng cây. Cảm ơn. – Squonk

10

Tạo một lớp riêng biệt đơn giản với hai phương pháp:

public class MyMenuHandler { 

    private Activity mActivity; 

    public MyMenuHandler(Activity activity) { 
     mActivity = activity; 
    } 

    public boolean onPrepareOptionsMenu(Menu menu) { 
     MenuInflater inflater = mActivity.getMenuInflater(); 
     menu.clear(); 
     inflater.inflate(R.menu.gv_options_menu, menu); 
     return true; 
    } 

    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.view: 
      ... 
     } 
    } 
} 

Trong hoạt động của bạn ghi đè lên các phương pháp đó gọi lại và chuyển hướng cuộc gọi đến một thể hiện của lớp MyMenuHandler của bạn:

public class MyActivity1 extends TabActivity { 

    private MyMenuHandler mMenuHandler; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     mMenuHandler = new MyMenuHandler(this); 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     // you may also add here some items which are specific 
     // for one activity, not for the others 
     ... 
     return mMenuHandler.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // handle selection of your specific items here, 
     // if none of them has been selected call mMenuHandler method 
     ... 
     return mMenuHandler.onOptionsItemSelected(item); 
    } 
} 

này sẽ cho phép bạn giữ ở một nơi mã phản hồi việc lựa chọn các mục menu cơ bản của bạn, do đó sẽ không cần phải lo lắng về việc sao chép nó vào tất cả các hoạt động có cùng menu.

+0

Perfect a.ch. người bạn đời. –

2

Bạn có thể đóng gói menu tác vụ trong một số fragment. Bằng cách này, bạn chỉ cần thêm đoạn trong menu onCreate của hoạt động của bạn.

Bạn cần gọi setHasOptionsMenu khi phân đoạn được tạo. Để thêm đoạn thêm, hãy sử dụng thẻ thay vì id bố cục.

+0

Xin chào. bạn có bất kỳ ví dụ tốt (hướng dẫn hoặc ví dụ) cho điều này? mảnh vỡ khá mới mẻ đối với tôi. – xDragonZ

+0

bắt đầu với http://developer.android.com/guide/topics/fundamentals/fragments.html – Janusz

+0

Lưu ý rằng điều này có thể áp dụng nếu bạn đang sử dụng API cấp 11 hoặc cao hơn –

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