在Android中禁用操作栏按钮

21

在Android中,是否有可能禁用操作栏(Action Bar)中的按钮?我搜索了一下,没有找到相关的代码片段。我认为应该有一些简单的方法来实现。

5个回答

46
  1. 当您想要禁用操作栏时,请执行用户操作,设置一些标志,例如disableButtonFlag

  2. 调用invalidateOptionsMenu()。这将触发onCreateOptionsMenu被调用以重新生成菜单。

  3. 最后,根据disableButtonFlag的状态修改您的onCreateOptionsMenu,以禁用所需的按钮。

if (disableButtonFlag) {
    menu.findItem(R.id.your_item).setEnabled(false);
} else {
    menu.findItem(R.id.your_item).setEnabled(true);
}
更简单地说:
menu.findItem(R.id.your_item).setEnabled(!disableButtonFlag);

但是我需要ActionBar,因为我的应用有相关要求。我需要继续使用ActionBar,并且当用户添加一个文件时,我需要禁用添加更多文件的功能(添加文件的按钮在ActionBar中)。 - Mediha
哦,禁用按钮已编辑。我假设是移除操作栏,通常禁用操作栏似乎是一般性的暗示。 - Vrashabh Irde
我该如何从我的Fragment/Activity超类中实现这个功能?我有一个侧边导航菜单,可以在我的Activity中交换内容片段。当打开侧边菜单时,我想禁用所有操作栏按钮。使用上述方法,我将不得不在每个内容片段类中都这样做。是否有一种更通用的方式可以从父Fragment类中实现它呢? - mtmurdock
如果你在一个Fragment中,现在可以调用requireActivity().invalidateOptionsMenu() - RedDeath

6

在操作栏中禁用按钮的简单方法是在onCreateOptionsMenu()中保存菜单的引用:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);    
    mMenu = menu;    // Save reference
    return super.onCreateOptionsMenu(menu);
}

然后调用菜单项上的setEnabled()方法来启用或禁用:

mMenu.findItem(R.id.my_action_item).setEnabled(false);

无需通过调用 invalidateOptionsMenu() 重新创建菜单。

3
对于正在使用自定义ActionBar的Android开发人员,即(保存和取消动作按钮),我尝试了以下代码来禁用Cancel操作按钮,如下所示:
Java代码:
LayoutInflater inflater = (LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View actionBarButtons = inflater.inflate(
                R.layout.edit_event_custom_actionbar, new LinearLayout(this),
                false);

        View cancelActionView = actionBarButtons
                .findViewById(R.id.action_cancel);
        cancelActionView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });
        cancelActionView.setEnabled(false);

        View doneActionView = actionBarButtons.findViewById(R.id.action_done);
        doneActionView.setOnClickListener(new OnClickListener() {

            @SuppressLint("NewApi")
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });
        getActionBar().setDisplayShowHomeEnabled(false);
        getActionBar().setDisplayShowTitleEnabled(false);
        getActionBar().setDisplayShowCustomEnabled(true);
        this.getActionBar().setCustomView(actionBarButtons);

edit_event_custom_actionbar.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="?attr/dividerVertical"
    android:dividerPadding="12dp"
    android:orientation="horizontal"
    android:showDividers="middle" >

    <!-- id must match corresponding menu item id -->
<TextView  
    android:id="@+id/action_cancel"
    style="@style/EditEventCustomActionButton"
    android:text="@string/cancel_label" 
    android:drawableLeft="@drawable/ic_action_cancel" android:padding="5dp" />

    <!-- id must match corresponding menu item id -->
<TextView  
    android:id="@+id/action_done"
    style="@style/EditEventCustomActionButton"
    android:text="@string/abc_action_mode_done" 
    android:drawableLeft="@drawable/abc_ic_cab_done_holo_dark" android:paddingRight="5dp" />

</LinearLayout>

并将以下代码添加到您的 /values/styles.xml 文件中:

<style name="EditEventCustomActionButton" parent="android:style/Widget.Holo.Light.ActionButton">
    <item name="android:layout_height">match_parent</item>
    <item name="android:layout_width">0dp</item>
    <item name="android:layout_weight">1</item>
    <item name="android:focusable">true</item>
    <item name="android:textColor">#FFFFFF</item>
</style>

1
你可以这样做:

public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.mainmenu, menu);
    menu.findItem(R.id.your_item).setEnabled(false);
    return super.onCreateOptionsMenu(menu);
}

但它应该在开始时启用,我需要在用户操作后禁用。请阅读上面的注释。谢谢。 - Mediha
只需在您的活动中创建一个“菜单”属性,并在“onCreateOptionsMenu”中进行初始化即可。 - Brtle
我找到了调用invalidateOptionsMenu的方法,基本上就是这样。谢谢。 - Mediha

0

如果您想在按钮被点击时禁用它,这很容易:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    item.isEnabled = false
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接