2012-07-22 23 views
8

Tôi đang sử dụng ActionBarSherlock. Tôi muốn có thể làm cho hai nút xuất hiện trong thanh hành động để đáp ứng với một hoạt động người dùng nhất định. Thao tác người dùng hoàn toàn không liên quan đến Thanh tác vụ. Khả năng hiển thị của các nút cần phải được kiểm soát bằng cách gọi một phương thức. Ngoài ra, phản hồi khi nhấp vào các nút đó sẽ được xử lý bằng mã ứng dụng của riêng tôi.ActionBarSherlock: Hiển thị/ẩn các nút Hành động theo chương trình thông qua một phương thức gọi

Các nút sẽ lý tưởng trông giống như các nút được tạo khi xác định các mục menu dưới dạng Mục tác vụ bằng cách sử dụng android:showAsAction="ifRoom|withText", như minh họa here.

Vấn đề của tôi là theo như tôi có thể nói, API ActionBar tiêu chuẩn không cung cấp cơ chế như vậy để hiển thị hoặc ẩn các nút Hành động theo ý muốn và chỉ có thể xác định các mục menu trong phạm vi onCreateOptionsMenu() được gọi bởi hệ thống.

Niềm tin của tôi là cách duy nhất tôi sẽ thêm các nút như thế này và hiển thị/ẩn chúng theo ý muốn là tạo bố cục tùy chỉnh cho chúng và sử dụng .setCustomView() để đặt chúng vào Thanh tác vụ. Mọi người thường đồng ý với điều đó, hay có điều gì đó tôi đã bỏ lỡ?

Nếu tôi đi xuống tuyến đường sử dụng .setCustomView(), tôi muốn các nút của tôi trông giống như các nút Hành động mục mà ActionBarSherlock hiển thị cho một mục menu có thuộc tính android:showAsAction="ifRoom|withText". Để làm điều này, bất cứ ai có thể tư vấn cho tôi mà chủ đề, phong cách, hoặc bố trí cụ thể từ bên trong thư viện ActionBarSherlock tôi nên sử dụng? Tôi đã cố gắng sử dụng R.layout.abs__action_menu_item_layout, nhưng cố gắng thổi phồng bố cục này tạo ra ngoại lệ liên quan đến colorStateList khi cố gắng lạm phát CapitalizingButton bố cục chứa.

Trả lời

9

Nếu bạn muốn hai nút đó có giao diện của các mục menu, thì bạn nên làm cho chúng các mục menu. Giả định rằng các mục menu chỉ có thể được xác định trong onCreateOptionsMenu() là không chính xác, bởi vì cũng có một phương thức được gọi là onPrepareOptionsMenu(), sẽ được gọi mỗi lần ngay trước khi menu được hiển thị. Cùng với phương thức invalidateOptionsMenu() của một hoạt động, bạn có thể dễ dàng tạo một trình đơn dat phản ánh trạng thái hiện tại trong thời gian thực.

Cách khác là giữ tham chiếu đến các đối tượng MenuItem riêng lẻ, vì tài liệu cho biết lưu giữ để giữ lại các đối tượng đó và thay đổi chế độ hiển thị của chúng khi thích hợp. Bạn có thể vẫn phải gọi số invalidateOptionsMenu() để cập nhật menu- Tôi không thể nhớ từ đầu của tôi. (Chỉnh sửa: Jake đánh tôi với hình này)

Cá nhân, tôi thích cách tiếp cận đầu tiên, vì bạn giữ tất cả logic liên quan đến menu và khả năng hiển thị dựa trên một loại trạng thái/mô hình nào đó. Tùy chọn thứ hai có thể đơn giản hơn để triển khai, tùy thuộc vào mã hiện tại của bạn, nhưng có thể dẫn đến nhiều thứ trong menu.

+1

Cảm ơn, MH. Có một số ý tưởng ở đây mà tôi rất biết ơn. Vẫn còn một vấn đề khiến tôi băn khoăn liệu tôi có cần phải sử dụng '.setCustomView()' hay không. Vấn đề là tôi muốn nhãn văn bản hiển thị luôn, không chỉ biểu tượng. Trên HTC One X của tôi không có gì trên ABS ngoài biểu tượng tràn và một Mục Hành động, nhãn văn bản của Mục Hành động chỉ hiển thị ở chế độ ngang, mặc dù có đủ chỗ trong cả hai hướng. Tôi nhận thấy rằng Thanh tác vụ áp dụng logic dựa trên mật độ màn hình và chiều rộng thanh để xác định xem nhãn có hiển thị hay không. Tôi sẽ điều tra thêm một chút. – Trevor

+0

Juse viết lại logic MenuItem của tôi trong Fragments bằng cách sử dụng lời khuyên bạn đã cung cấp - công trình MUCH tốt hơn bây giờ. Bất cứ ai đi theo cách này - hãy chắc chắn làm setHasMenuOptions (true) và đi theo con đường @MH. đề xuất (tôi làm cả onPrepareOptionsMenu và giữ tham chiếu đến đối tượng MenuItem). – kape123

+0

"Cá nhân, tôi thích cách tiếp cận đầu tiên, vì bạn giữ tất cả các logic liên quan đến trình đơn được nhóm lại với nhau và khả năng hiển thị dựa trên một số loại trạng thái/mô hình." Có, cùng với mọi thứ khác, cùng nhau trong đối tượng thần, được gọi là Hoạt động. Và đối tượng thần là một mô hình chống. –

11

Bạn có thể gọi setVisibility trên MenuItem trường hợp.

documentation states rằng "Bạn có thể giữ an toàn menu (và bất kỳ mục nào được tạo từ nó), thực hiện sửa đổi như mong muốn, cho đến khi lần tiếp theo onCreateOptionsMenu() được gọi."

+0

Cảm ơn, Jake (và cảm ơn rất nhiều về ABS - mặc dù có lẽ bạn đang mệt mỏi vì đã cảm ơn vì điều đó bây giờ :-)). Như tôi đã nhận xét với MH, một vấn đề là tôi muốn ép buộc các nhãn văn bản luôn hiển thị. Đây là một trong những lý do tại sao tôi có thể chỉ cần áp dụng chế độ xem tùy chỉnh, nhưng trước tiên tôi sẽ thử một số đề xuất này. – Trevor

2

bạn đã kiểm tra các mẫu demo chưa?

họ có tính năng này trên "tính năng chuyển đổi".

+0

Rất cám ơn. Tôi sẽ xem xét mẫu đó ngay bây giờ. – Trevor

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