Có thể thay đổi các mục menu tùy chọn theo chương trình không? Bất cứ ai có thể cung cấp cho tôi một ví dụ được không?
Ngoài ra, tôi muốn vô hiệu hóa một số mục nhất định để chúng không nghe thấy tiếng nhấp chuột, có được không?
Câu trả lời:
Đối với bất kỳ ai cần thay đổi các tùy chọn của menu động:
private Menu menu;
// ...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
this.menu = menu;
getMenuInflater().inflate(R.menu.options, menu);
return true;
}
// ...
private void hideOption(int id)
{
MenuItem item = menu.findItem(id);
item.setVisible(false);
}
private void showOption(int id)
{
MenuItem item = menu.findItem(id);
item.setVisible(true);
}
private void setOptionTitle(int id, String title)
{
MenuItem item = menu.findItem(id);
item.setTitle(title);
}
private void setOptionIcon(int id, int iconRes)
{
MenuItem item = menu.findItem(id);
item.setIcon(iconRes);
}
item.setVisible(false);
, mục chỉ bị ẩn khi tôi nhấp vào chính Menu. Nếu tôi sử dụng invalidateOptionsMenu();
mục không phản hồi để nhấp vào. Tôi đánh giá cao nếu bạn có thể giúp tôi về một vấn đề tương tự mà tôi đang gặp phải. stackoverflow.com/questions/54756799/…
setVisible
trạng thái mà bạn cũng nên gọi setEnabled(false)
nếu không mục vẫn có thể được gọi thông qua phím tắt của nó
menu.xml
<item
android:id="@+id/item1"
android:title="your Item">
</item>
đưa vào tệp java của bạn
public void onPrepareOptionsMenu(Menu menu) {
menu.removeItem(R.id.item1);
}
Giống như Nikolay đã nói, hãy làm điều đó trong onPrepareOptionsMenu ().
Đối với các mục menu trong thanh tác vụ, bạn phải làm mất hiệu lực menu bằng
activity.invalidateOptionsMenu();
Điều này được mô tả chi tiết hơn ở đây Làm cách nào tôi có thể làm mới ActionBar khi onPrepareOptionsMenu chuyển đổi mục menu?
Nếu tôi phải thay đổi nội dung của menu tùy chọn, tôi thực hiện nó trong onMenuOpened (). Điều này cho phép tôi kiểm tra trạng thái đang chạy ngay tại thời điểm người dùng đang truy cập menu.
public boolean onMenuOpened(int featureid, Menu menu)
{
menu.clear();
if (!editable)
{
MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign));
MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify));
MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete));
itemAdd.setShortcut('0', 'a');
itemMod.setShortcut('1', 'm');
itemDel.setShortcut('2', 'd');
}
else
{
MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges));
itemSave.setShortcut('0', 'S');
}
return true;
}
Để tắt một số mục nhất định:
MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);
item.setVisible(false);
, mục của tôi chỉ bị ẩn khi tôi nhấp vào chính Menu (ba dấu chấm). Nếu tôi sử dụng invalidateOptionsMenu();
một số mục không phản hồi cho nhấp chuột. Tôi đánh giá cao nếu bạn có thể giúp tôi về một vấn đề tương tự mà tôi đang gặp phải. stackoverflow.com/questions/54756799/…
bằng cách sử dụng các dòng sau tôi đã thực hiện để thêm các giá trị trong menu
getActivity().invalidateOptionsMenu();
thử công việc này như một cái duyên với tôi.
Hãy thử mã này:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
this.menu=menu;
updateMenuItems(menu);
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.document_list_activity_actions, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
if (item.getItemId() == android.R.id.home) {
onHomeButtonPresssed();
}else if (item.getItemId() == R.id.action_delete) {
useCheckBoxAdapter=false;
deleteDocuments();
} else if (item.getItemId() == R.id.share) {
useCheckBoxAdapter=false;
shareDocuments();
} else if (item.getItemId() == R.id.action_tick) {
useCheckBoxAdapter=true;
onShowCheckboxes();
}
updateMenuItems(menu);
return true;
}
private void updateMenuItems(Menu menu){
if (useCheckBoxAdapter && menu != null) {
menu.findItem(R.id.action_delete).setVisible(true);
menu.findItem(R.id.share).setVisible(true);
menu.findItem(R.id.action_tick).setVisible(false);
} else {
menu.findItem(R.id.action_delete).setVisible(false);
menu.findItem(R.id.share).setVisible(false);
menu.findItem(R.id.action_tick).setVisible(true);
}
invalidateOptionsMenu();
}
invalidateOptionsMenu();
, các mục luôn hiển thị của tôi ngừng hoạt động (ý tôi là các mục không phản hồi với nhấp chuột). Tôi đánh giá cao nếu bạn có thể giúp tôi về một vấn đề tương tự mà tôi đang gặp phải. stackoverflow.com/questions/54756799/…
Bạn có thể làm điều gì đó đơn giản như tôi đã làm. Chỉ cần thay đổi văn bản thành những gì cần thiết khi chạm vào mục menu. Tôi cần tắt và bật âm thanh, cộng với khả năng thực hiện một hành động bằng cách chạm vào âm thanh đó. Đây là mã của tôi:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.audioOn:
audioOn = !audioOn;
if (audioOn)
item.setTitle("Audio Off");
else
item.setTitle("Audio On");
return true;
case R.id.touchOn:
touchOn = !touchOn;
if (touchOn)
item.setTitle("Touch Off");
else
item.setTitle("Touch On");
return true;
default:
return super.onOptionsItemSelected(item);
}
}
audioOn và touchOn là các boolean được kiểm tra trong các phần khác của mã. Hi vọng điêu nay co ich.
bạn có thể hoàn thành nhiệm vụ của mình đơn giản bằng cách thực hiện như sau:
private Menu menu;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.drive_menu, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
this.menu = menu;
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_toggle_grid) {
handleMenuOption(id);
return true;
} else if(id == R.id.action_toggle_list){
handleMenuOption(id);
return true;
}
return super.onOptionsItemSelected(item);
}
private void handleMenuOption(int id) {
MenuItem item = menu.findItem(id);
if (id == R.id.action_toggle_grid){
item.setVisible(false);
menu.findItem(R.id.action_toggle_list).setVisible(true);
}else if (id == R.id.action_toggle_list){
item.setVisible(false);
menu.findItem(R.id.action_toggle_grid).setVisible(true);
}
}
Trong trường hợp bạn có BottomBar:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (mBottomBar.getCurrentTabId() == R.id.tab_more) {
getMenuInflater().inflate(R.menu.more_menu, menu);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.preferences:
startActivity(new Intent(this, PreferenceActivity.class));
break;
}
return super.onOptionsItemSelected(item);
}
Sau đó, bạn chỉ cần gọi:
@Override
public void onBottomBarClick(int tabId) {
supportInvalidateOptionsMenu();
}
Kotlin Code để truy cập thanh công cụ OptionsMenu các mục theo lập trình & thay đổi văn bản / biểu tượng, ..:
1-Chúng tôi có mục menu của chúng tôi trong tệp mục menu như: menu.xml, mã mẫu cho điều này:
<?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:id="@+id/balance"
android:title="0"
android:orderInCategory="100"
app:showAsAction="always" />
</menu>
2- Định nghĩa một biến để truy cập đối tượng menu trong lớp:
var menu: Menu? = null
3- khởi tạo nó trong onCreateOptionsMenu:
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.main, menu)
this.menu = menu
return true
}
4- Truy cập các mục menu bên trong mã của bạn hoặc thú vị:
private fun initialBalanceMenuItemOnToolbar() {
var menuItemBalance = menu?.findItem(R.id.balance)
menuItemBalance?.title = Balance?.toString() ?: 0.toString()
// for change icon : menuWalletBalance?.icon
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.calendar, menu);
if(show_list == true) {
if(!locale.equalsIgnoreCase("sk")) menu.findItem(R.id.action_cyclesn).setVisible(false);
return true;
}
menu
đã được thiết lập trước khi cố gắngMenuItem
thoát khỏi nó. Ví dụ: nếu bạn có một cái gì đó giống nhưactionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)
, các tab được tải trước menu, vì vậy việc gọihideOption
/showOption
trongonTabSelected
dẫn đến ngoại lệ con trỏ rỗng.