2011-11-26 44 views
62

Tôi có Hoạt động với ActionBar và điều hướng tab. Tôi đang sử dụng chế độ chia nhỏ, vì vậy các tab ở trên cùng và các hành động nằm ở thanh dưới cùng. Làm thế nào tôi có thể tự động thay đổi các hành động dưới cùng? Tôi cần điều này bởi vì mỗi tab có các hành động khác nhau.Làm cách nào để thay đổi động tác của Thanh tác vụ?

Trả lời

129

Vì các hành động được điền bởi trình đơn tùy chọn của hoạt động, bạn có thể sử dụng Activity#invalidateOptionsMenu(). Thao tác này sẽ hủy menu hiện tại và gọi lại phương thức onCreateOptionsMenu/onPrepareOptionsMenu của hoạt động của bạn để tạo lại.

Nếu bạn đang sử dụng tab thanh tác vụ để thay đổi cấu hình phân đoạn của mình thì có cách tốt hơn. Có từng phân đoạn quản lý phần riêng của trình đơn. Những mảnh này nên gọi setHasOptionsMenu(true). Khi các đoạn có các mục menu tùy chọn được thêm vào hoặc bị xóa, hệ thống sẽ tự động vô hiệu hóa menu tùy chọn và gọi tới các phương thức của từng phân đoạn onCreateOptionsMenu/onPrepareOptionsMenu ngoài hoạt động. Bằng cách này, mỗi phân đoạn có thể quản lý các mục của riêng nó và bạn không cần phải lo lắng về việc thực hiện chuyển đổi menu bằng tay.

+17

Chỉ cần một lưu ý: setHasOptionsMenu() nên được gọi là trong onCreate theo [tài liệu] (http://developer.android.com/guide/topics/fundamentals/fragments.html#ActionBar). – Dave

+1

Đó không thực sự là một yêu cầu. Nó có thể được gọi từ đó và nó là một nơi tốt để làm như vậy trong nhiều trường hợp, nhưng nếu đoạn đã được thêm vào và không ẩn menu tùy chọn của hoạt động sẽ bị vô hiệu và trạng thái mới sẽ được phản ánh. – adamp

+2

Tôi đồng ý với bạn, tuy nhiên các tài liệu không làm cho nó nghe như thế. "Tuy nhiên, để gọi phương thức này, bạn phải gọi setHasOptionsMenu() trong khi onCreate() ...". Tôi nghĩ rằng họ có nghĩa là bạn phải gọi setHasOptionsMenu() nhưng họ vô tình làm cho nó âm thanh như trong quá trình onCreate() cũng là một yêu cầu. – Dave

1

ActionMode.invalidate() đã thực hiện thủ thuật. Nó đã khiến cho onPrepareActionMode() được gọi lại.

Activity#invalidateOptionsMenu() đã làm không làm cho số onPrepareActionMode() được gọi khi sử dụng các mục danh sách có nhiều lựa chọn.

+0

làm cách nào để nhận được actionmode? Tôi chỉ có ActionBar – eugene

+0

ActionMode là tham số đầu tiên trong onPrepareActionMode (...): http: // goo.gl/tMyBx –

+0

Tôi chưa bao giờ nghe nói về onPrepareAction –

15

Activity.invalidateOptionsMenu() đòi hỏi API Cấp 11. Có một giải pháp đơn giản hơn đó là tương thích ngược:

Thêm MenuItem để Menu ban đầu nhưng thiết tầm nhìn của nó để sai. Set tầm nhìn đến đúng khi mong muốn, sử dụng MenuItem.setVisible()

+1

Cảm ơn. Chỉ trong trường hợp giúp người khác ... Đặt 'MenuItem refreshItem = menu.findItem (R.id.action_refresh); refreshItem.setVisible (false); 'trong' onCreateOptionsMenu' – AlvaroSantisteban

+0

@AlvaroSantisteban hoặc '" android: visible "=" false "' trong xml –

1

Activity.invalidateOptionsMenu() đòi hỏi API Cấp 11. Sử dụng các phiên bản hỗ trợ thư viện của nó supportInvalidateOptionsMenu().

AppCompatActivity activity = (AppCompatActivity) getActivity(); 
activity.supportInvalidateOptionsMenu(); 
Các vấn đề liên quan