Tôi có một thanh hành động với một menuitem. Làm thế nào tôi có thể ẩn / hiển thị mục menu đó?
Đây là những gì tôi đang cố gắng làm:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
Tôi có một thanh hành động với một menuitem. Làm thế nào tôi có thể ẩn / hiển thị mục menu đó?
Đây là những gì tôi đang cố gắng làm:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
Câu trả lời:
Chỉ vào một MenuItem
mục như vậy, gọi setVisible
nó để điều chỉnh mức độ hiển thị của nó và sau đó gọiinvalidateOptionsMenu()
về hoạt động của bạn để menu ActionBar được điều chỉnh cho phù hợp.
Cập nhật: A MenuItem
không phải là chế độ xem thông thường, đó là một phần trong bố cục của bạn. Đó là một cái gì đó đặc biệt, hoàn toàn khác nhau. Lợi nhuận mã của bạn null
cho item
và đang gây ra vụ tai nạn. Thay vào đó, những gì bạn cần là làm:
MenuItem item = menu.findItem(R.id.addAction);
Đây là chuỗi mà bạn nên gọi: cuộc gọi đầu tiên invalidateOptionsMenu()
và sau đó bên trong onCreateOptionsMenu(Menu)
có được một tham chiếu đến MenuItem (bằng cách gọi menu.findItem()
) và gọi setVisible()
nó
MenuItem
có thể là null
vì bạn đang sử dụng getItem
thay vì findItem
. Chúng tôi không bao giờ có thể biết, mà không thấy cả mã của bạn và nhật ký sự cố.
onCreateOptionsMenu
, và đặt mức độ hiển thị của mục tại thời điểm đó. Hoặc giữ tài liệu tham khảo xung quanh cho đến khi bạn quyết định xem nó có thể nhìn thấy hay không.
invalidateOptionsMenu()
và sau đó bên trong onCreateOptionsMenu(Menu)
có được một tham chiếu đến MenuItem
(bằng cách gọi menu.findItem()
) và gọi setVisible()
nó. Các câu trả lời của suhas_sm và bởi P1r4nh4 trình bày cách tiếp cận đúng.
Tìm thấy một phụ lục cho câu hỏi này:
Nếu bạn muốn thay đổi mức độ hiển thị của các mục trong menu, bạn chỉ cần đặt biến thành viên trong hoạt động để nhớ rằng bạn muốn ẩn menu và gọi invalidateOptionsMenu()
và ẩn các mục trong onCreateOptionsMenu(...)
phương thức ghi đè của bạn .
//anywhere in your code
...
mState = HIDE_MENU; // setting state
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// inflate menu from xml
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.settings, menu);
if (mState == HIDE_MENU)
{
for (int i = 0; i < menu.size(); i++)
menu.getItem(i).setVisible(false);
}
}
Trong ví dụ của tôi, tôi đã ẩn tất cả các mục.
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
Trạng thái tài liệu: "Bạn phải trả về đúng cho menu được hiển thị; nếu bạn trả về sai, nó sẽ không được hiển thị".
onPrepareOptionsMenu()
nên được sử dụng để hiển thị / ẩn logic thay vì onCreateOptionsMenu()
nó chỉ được gọi một lần nên không hữu ích nếu bạn muốn thay đổi các mục menu sau khi khởi tạo. Vì vậy, tăng cường onCreate, nhưng hiển thị / ẩn trong onPrepare.
Đúng.
invalidateOptionsMenu()
khi bạn muốn ẩn tùy chọn. Cái này sẽ gọi onCreateOptionsMenu()
.onCreateOptionsMenu()
, kiểm tra cờ / điều kiện và hiển thị hoặc ẩn nó theo cách sau:MenuItem item = menu.findItem(R.id.menu_Done); if (flag/condition)) { item.setVisible(false); } else { }
invalidateOptionsMenu
thay thế invalidateOptions
?
onCreateOptionsMenu
Bạn có thể gọi đây:
MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);
Cập nhật:
Hãy chắc chắn rằng mã của bạn không trả về null
cho item
hoặc nó có thể sụp đổ các ứng dụng.
Tôi đang tìm kiếm một câu trả lời với một chút bối cảnh. Bây giờ tôi đã tìm ra nó, tôi sẽ thêm câu trả lời đó.
Theo mặc định, nút chia sẻ sẽ bị ẩn, như được đặt bởi android:visible="false"
.
main_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- hide share button by default -->
<item
android:id="@+id/menu_action_share"
android:icon="@drawable/ic_share_white_24dp"
android:visible="false"
android:title="Share"
app:showAsAction="always"/>
<item
android:id="@+id/menu_action_settings"
android:icon="@drawable/ic_settings_white_24dp"
android:title="Setting"
app:showAsAction="ifRoom"/>
</menu>
Nhưng nút chia sẻ có thể tùy chọn được hiển thị dựa trên một số điều kiện.
MainActivity.java
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
MenuItem shareItem = menu.findItem(R.id.menu_action_share);
// show the button when some condition is true
if (someCondition) {
shareItem.setVisible(true);
}
return true;
}
invalidateOptionsMenu()
để làm mới menu.
không làm việc cho tôi. Tôi đã phải sử dụng rõ ràng onPrepareOptionsMenu
để thiết lập một mục vô hình.
Vì vậy, sử dụng onCreateOptionsMenu
để tạo menu và onPrepareOptionsMenu
thay đổi khả năng hiển thị, vv
onPrepareOptionsMenu
có vẻ như là nơi phù hợp để thực hiện loại hoạt động này: "Chuẩn bị menu tùy chọn tiêu chuẩn của Màn hình sẽ được hiển thị. Điều này được gọi ngay trước khi menu được hiển thị, mỗi khi nó được hiển thị . Bạn có thể sử dụng phương pháp này để bật / tắt các mục một cách hiệu quả hoặc tự động sửa đổi nội dung. "
invalidateOptionsMenu()
để làm mới menu.
Ban đầu đặt mức độ hiển thị của mục menu thành false trong tệp bố cục menu như sau:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:visible="false"
android:id="@+id/action_do_something"
android:title="@string/txt_do_something"
app:showAsAction="always|withText"
android:icon="@drawable/ic_done"/>
</menu>
Sau đó, bạn có thể chỉ cần đặt mức độ hiển thị của mục menu thành false trong onCreateOptionsMothy () sau khi làm tăng menu.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(menu,R.menu.menu);
MenuItem item = menu.findItem(R.id.menuItemId);
if (item != null){
item.setVisible(false);
}
}
Thử cái này:
MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);
Điều này làm việc cho tôi từ cả Hoạt động và Mảnh vỡ
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (menu.findItem(R.id.action_messages) != null)
menu.findItem(R.id.action_messages).setVisible(false);
}
Câu trả lời P1r4nh4 hoạt động tốt, tôi chỉ đơn giản hóa nó bằng cờ boolean:
public int mState = 0; //at the top of the code
//where you want to trigger the hide action
mState = 1; // to hide or mState = 0; to show
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// inflate menu from xml
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.settings, menu);
if (mState == 1) //1 is true, 0 is false
{
//hide only option 2
menu.getItem(2).setVisible(false);
}
}
0
và 1
không phải là "cờ boolean", đó là giả boolean. ngoài ra, không có lý do để sử dụng một boolean thực tế ở đây.
Theo trang web chính thức của nhà phát triển Android, OnCreateOptionMothy (menu Menu) không được đề xuất để thay đổi các mục hoặc biểu tượng menu, mức độ hiển thị..vv tại Runtime.
Sau khi hệ thống gọi onCreateOptionsMothy (), nó sẽ giữ lại một thể hiện của Menu bạn điền và sẽ không gọi lại onCreateOptionsMothy () trừ khi vì lý do nào đó menu bị vô hiệu. Tuy nhiên, bạn chỉ nên sử dụng onCreateOptionsMothy () để tạo trạng thái menu ban đầu và không thực hiện thay đổi trong vòng đời hoạt động.
Nếu bạn muốn sửa đổi menu tùy chọn dựa trên các sự kiện xảy ra trong vòng đời hoạt động, bạn có thể làm như vậy trong phương thức onPrepareOptionsMothy (). Phương thức này chuyển cho bạn đối tượng Menu như hiện tại để bạn có thể sửa đổi nó, chẳng hạn như thêm, xóa hoặc vô hiệu hóa các mục. (Các đoạn cũng cung cấp một cuộc gọi lại onPrepareOptionsMothy ().) - Trang web chính thức củaAndroidDeveloper -
Khi được giới thiệu Bạn có thể sử dụng phương thức onOptionsItemSelected (mục MenuItem) này theo dõi đầu vào của người dùng.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.edit) {
Intent intent = new Intent(this, ExampleActivity.class);
intent.putExtra(BUNDLE_KEY, mConnection);
startActivityForResult(intent, PICK_CHANGE_REQUEST);
return true;
} else if (id == R.id.delete) {
showDialog(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Nếu bạn cần thay đổi Mục menu trong thời gian chạy, Bạn có thể sử dụng onPrepareOptionsMothy (Menu menu) để thay đổi chúng
@Override
public boolean onPrepareOptionsMenu(Menu menu){
if (Utils.checkNetworkStatus(ExampleActivity.this)) {
menu.findItem(R.id.edit).setVisible(true);
menu.findItem(R.id.delete).setVisible(true);
}else {
menu.findItem(R.id.edit).setVisible(false);
menu.findItem(R.id.delete).setVisible(false);
}
return true;
}
setVisible(false)
đối với mục luôn hiển thị, nó sẽ không biến mất cho đến khi tôi nhấp vào ba dấu chấm (chính Menu). Nếu tôi sử dụng invalidateOptionsMenu()
trong onPrepareOptionsMenu
các mục ngay lập tức tự tổ chức lại, nhưng họ sẽ mất hành động của họ (nếu tôi nhấp vào bất kỳ mục nào, thì không có gì).
đặt một giá trị cho một biến và gọi không hợp lệOptionsMothy ();
ví dụ
selectedid=arg2;
invalidateOptionsMenu();
public boolean onPrepareOptionsMenu(Menu menu) {
if(selectedid==1){
menu.findItem(R.id.action_setting).setVisible(false);
menu.findItem(R.id.action_s2).setVisible(false);
menu.findItem(R.id.action_s3).setVisible(false);
}
else{
if(selectedid==2){
menu.findItem(R.id.action_search).setVisible(false);
menu.findItem(R.id.action_s4).setVisible(false);
menu.findItem(R.id.action_s5).setVisible(false);
}
}
return super.onPrepareOptionsMenu(menu);
}
setVisible(false)
đối với mục luôn hiển thị, nó sẽ không biến mất cho đến khi tôi nhấp vào ba dấu chấm (chính Menu). Nếu tôi sử dụng invalidateOptionsMenu()
trong onPrepareOptionsMenu
các mục ngay lập tức tự tổ chức lại, nhưng họ sẽ mất hành động của họ (nếu tôi nhấp vào bất kỳ mục nào, thì không có gì).
Bạn có thể sử dụng toolbar.getMenu().clear();
để ẩn tất cả các mục menu cùng một lúc
Bằng cách đặt Hiển thị của tất cả các mục trong Menu, menu thanh ứng dụng hoặc menu tràn sẽ tự động Ẩn
Thí dụ
private Menu menu_change_language;
...
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
...
...
menu_change_language = menu;
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(true);
return super.onCreateOptionsMenu(menu);
}
Trước khi đi đến đoạn khác, sử dụng mã dưới đây:
if(menu_change_language != null){
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(false);
}
https://stackoverflow.com/a/21215280/466363 - được trả lời bởi Look Alterno và Sufian
.
private Menu mMenu;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.track_fragment, menu);
mMenu = menu;
}
...
private void someMethod() {
...
if (mMenu != null) {
MenuItem item = mMenu.findItem(R.id.new_track);
if (item != null) {
item.setVisible(false);
ActivityCompat.invalidateOptionsMenu(this.getActivity());
}
}
...
}
ActivityCompat.invalidateOptionsMothy () không gọi lại onPrepareOptionsMothy (); Nó chỉ cập nhật menu trực tiếp.
Một sốMethod () của tôi được gọi từ một số nơi, ngay cả trước khi onCreateOptionsMothy (), vì vậy tôi phải kiểm tra mMothy! = Null.
Nếu bạn đã làm mọi thứ như trong các câu trả lời ở trên, nhưng một mục menu vẫn hiển thị, hãy kiểm tra xem bạn có tham chiếu đến tài nguyên duy nhất không . Chẳng hạn, trong onCreateOptionsMothy hoặc onPrepareOptionsMothy
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem menuOpen = menu.findItem(R.id.menu_open);
menuOpen.setVisible(false);
}
Ctrl + Nhấp vào R.id.menu_open và kiểm tra xem nó chỉ tồn tại trong một tệp menu. Trong trường hợp khi tài nguyên này đã được sử dụng ở bất cứ đâu và được tải trong một hoạt động, nó sẽ cố gắng ẩn ở đó.
Cách tốt nhất để ẩn tất cả các mục trong menu chỉ bằng một lệnh là sử dụng "nhóm" trên menu xml của bạn. Chỉ cần thêm tất cả các mục menu sẽ có trong menu tràn của bạn trong cùng một nhóm.
Trong ví dụ này, chúng tôi có hai mục menu sẽ luôn hiển thị (mục thông thường và tìm kiếm) và ba mục tràn:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/someItemNotToHide1"
android:title="ITEM"
app:showAsAction="always" />
<item
android:id="@+id/someItemNotToHide2"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="android.support.v7.widget.SearchView"
android:title="Search"/>
<group android:id="@+id/overFlowItemsToHide">
<item android:id="@+id/someID"
android:orderInCategory="1" app:showAsAction="never" />
<item android:id="@+id/someID2"
android:orderInCategory="1" app:showAsAction="never" />
<item android:id="@+id/someID3"
android:orderInCategory="1" app:showAsAction="never" />
</group>
</menu>
Sau đó, trên hoạt động của bạn (tốt nhất là tại onCreateOptionsMothy), hãy sử dụng lệnh setgroupVisible để đặt tất cả các mục menu hiển thị thành sai hoặc đúng.
public boolean onCreateOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
Nếu bạn muốn sử dụng lệnh này ở bất kỳ nơi nào khác trong hoạt động của mình, hãy nhớ lưu lớp menu thành cục bộ và luôn kiểm tra xem menu có rỗng không, bởi vì bạn có thể thực thi trước khi tạoOptionsMothy:
Menu menu;
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
}
public void hideMenus() {
if (menu != null) menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
Đối với những người sử dụng thư viện Appcompat: Nếu lớp con Activity của bạn ActionBarActivity, bạn có thể gọi supportInvalidateOptionsMothy ()
Nhìn thấy ở đây: https://stackoverflow.com/a/19649877/1562524
Tôi nghĩ rằng một cách tiếp cận tốt hơn sẽ là sử dụng một biến thành viên cho menu, khởi tạo nó trong onCreateOptionsMothy () và chỉ sử dụng setVisible () sau đó, mà không làm mất hiệu lực menu tùy chọn.
mã này làm việc cho tôi
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu,menu);
if (Application.sharedPreferences.getInt("type",1) == 2)
{
menuItem = menu.findItem(R.id.menu_travel_orders);
menuItem.setVisible(false);
}
return super.onCreateOptionsMenu(menu);
}
Cách tiếp cận này làm việc cho tôi:
private Menu thismenu;
if (condition)
{
if(thismenu != null)
{
thismenu.findItem(R.id.menu_save).setVisible(true);
Toast.makeText(ProfileActivity.this,
""+thismenu.findItem(R.id.menu_save).getTitle(),
Toast.LENGTH_SHORT).show();
}else
{
thismenu.findItem(R.id.menu_save).setVisible(false);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.profile_menu, menu);
thismenu = menu;
return true;
}
Bạn đang cố gắng truy cập một mục menu từ một hoạt động, không có quyền truy cập vào phạm vi. Cuộc gọi để tìm mục menu sẽ trả về null , vì chế độ xem không bị ràng buộc với cả hoạt động và bố cục mà bạn đang gọi.
Các mục menu được liên kết với các mục như " Thanh điều hướng " lần lượt được liên kết với hoạt động tương ứng.
Vì vậy, khởi tạo các chế độ xem đó trong hoạt động (), sau đó truy cập vào các mục menu cùng với các chế độ xem đó.
Navigation navView;
navView = findViewById(R.id.navigationView);
MenuItem item = navView.getMenu().findItem(R.id.item_hosting);
item.setVisible(false);
sử dụng invalidateOptionsMenu()
để gọi onPrepareOptionsMenu(menu: Menu?)
bạn chỉ nên sử dụng onCreateOptionsMothy () để tạo trạng thái menu ban đầu và không thực hiện thay đổi trong vòng đời hoạt động ...
Khi một sự kiện xảy ra và bạn muốn thực hiện cập nhật menu, bạn phải gọi không hợp lệOptionsMothy () để yêu cầu hệ thống gọi onPrepareOptionsMothy ().
Android kotlin, ẩn hoặc đặt mức độ hiển thị của một mục menu trong thanh hành động theo lập trình.
override fun onCreateOptionsMenu(menu: Menu): Boolean {
val inflater = menuInflater
inflater.inflate(R.menu.main_menu, menu)
val method = menu.findItem(R.id.menu_method)
method.isVisible = false //if want to show set true
return super.onCreateOptionsMenu(menu)
}