2010-01-05 20 views
6

Tôi biết rằng Android cung cấp một số phương pháp hữu ích để được ghi đè để xác định một thực đơn:Android: Cách có một menu được chia sẻ trong mỗi (Danh sách) Hoạt động mà không cần viết lại các phương pháp ghi đè?

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    menu.add(0, AIS, 0, "Activity Inventory Sheet").setIcon(android.R.drawable.ic_menu_upload); 
       // ... 
    return true; 
} 

public boolean onOptionsItemSelected(MenuItem item) { 
    Intent i; 
    switch (item.getItemId()) { 
    case AIS: i = new Intent(this, ActivityInventorySheet.class); 
     startActivity(i); 
       return true; 
    // ... 
    } 
    return false; 
} 

Tôi muốn có menu này được chia sẻ bởi mỗi hoạt động và ListActivity của ứng dụng Android của tôi. Điều này là để có một menu chuẩn trong mỗi (List) Activity cho phép người dùng chuyển đến mọi phần của ứng dụng trong một lần nhấp.

Ngay bây giờ, cách dễ nhất để đạt được điều này là sao chép và dán cả hai phương pháp trong mọi (Danh sách) Hoạt động của ứng dụng. Tôi không thích sự thừa mã này được viết :)

Phân lớp phụ có phải là sự lựa chọn hợp lý không? Tôi đã thấy rằng sub-classing một ListActivity của tôi không hoạt động rất tốt (các luồng truy xuất các đối tượng từ một cơ sở dữ liệu đang đưa ra các vấn đề). Có cách nào khác để chia sẻ menu dù là Hoạt động không?

Cảm ơn

Trả lời

10

tôi thấy không có lý do điều này sẽ không làm việc một cách hoàn hảo:

public abstract class MyListActivity extends ListActivity 
{ 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     menu.add(0, AIS, 0, "Activity Inventory Sheet").setIcon(android.R.drawable.ic_menu_upload); 
     // ... 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     Intent i; 
     switch (item.getItemId()) { 
      case AIS: i = new Intent(this, ActivityInventorySheet.class); 
      startActivity(i); 
      return true; 
      // ... 
     } 
     return false; 
    }  
} 

Sau đó chỉ cần có Hoạt động của bạn mở rộng MyListActivity thay vì ListActivity.

Tôi đã thấy rằng phụ classing một trong ListActivity tôi không hoạt động rất tốt (đề mà lấy đối tượng từ một cơ sở dữ liệu đang đưa ra vấn đề).

Điều này nghe giống như một vấn đề hoàn toàn khác. Bạn có thể muốn đăng một câu hỏi riêng về vấn đề này. Đơn giản chỉ cần mở rộng một lớp trong Java sẽ không tạo ra bất kỳ vấn đề nào giống như bạn đang mô tả.

+0

Điều này hoạt động rất tốt. Tôi phải tạo hai lớp trừu tượng, một cho Hoạt động và lớp kia cho ListActivities (nếu không ví dụ bạn đã cung cấp sẽ không hoạt động đối với Hoạt động đơn giản). Dù sao, đây là mã ít hơn nhiều để viết và căn hộ theo nhu cầu của tôi. Cảm ơn bạn! – dgraziotin

+0

Nếu bạn có một Hoạt động mở rộng một ListActivity, bạn cần một ListView trong bố trí của bạn, nếu không nó bị treo ... – jul

13

Tôi sử dụng lớp trợ giúp với phương pháp tĩnh để khởi tạo và xử lý các tùy chọn menu phổ biến, sau đó mỗi Hoạt động xác định riêng onCreateOptionsMenu v.v.

Something như

class SharedMenu { 
    public static void onCreateOptionsMenu(Menu menu) { 
     menu.add(...); 
     menu.add(...); 
    } 
} 

public class MyActivity extends Activity { 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     menu.add(...); // specific to this activity 
     SharedMenu.onCreateOptionsMenu(menu); 
     return true; 
    } 

} 

với các phương pháp hơn cho onMenuItemSelected, vv

Chỉnh sửa: Tôi không sử dụng một lớp cơ sở chung vì tôi cần hai trong số họ để bắt đầu, một cho các hoạt động và một hoạt động khác cho danh sách, và sau đó trong trường hợp của tôi, tôi cần thêm các tùy chọn menu tùy chỉnh vào một số hoạt động.

+2

Tránh phân lớp là một điều tốt. –

+0

Đây cũng là một câu trả lời hay, đặc biệt nếu bạn cần tăng tùy chọn menu tùy chỉnh – dgraziotin

+0

@DanielYankowsky Tại sao tốt nhất nên tránh phân lớp trong trường hợp này? –

1

Tôi vừa thêm một tính năng vào GreenDroid để quản lý điều đó. Có thể khá hữu ích, hãy kiểm tra. Tôi sẽ cố gắng đăng một ví dụ sau.

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