Отключить кнопку панели действий в Android

Можно ли отключить кнопку в панели действий в Android? Я смотрел вокруг, и я не мог найти фрагмент кода для этого, я думал, что должен быть простой способ.

Ответы

Ответ 1

  • После выполнения действия пользователя, когда вы хотите отключить панель действий, установите некоторый флаг, скажем disableButtonFlag.

  • Вызов invalidateOptionsMenu(). Это вызовет вызов onCreateOptionsMenu для восстановления вашего меню.

  • Наконец, измените свой onCreateOptionsMenu, чтобы отключить нужную кнопку в зависимости от состояния disableButtonFlag.

    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);
    

Ответ 2

Для разработчиков Android, которые используют пользовательские кнопки ActionBar i.e(Сохранить и отменить действие), я попробовал следующий код, чтобы отключить кнопку "Отменить действие" следующим образом:

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>

Ответ 3

Вы можете сделать что-то вроде этого:

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);
}

Ответ 4

Простым способом отключения кнопки на панели действий является сохранение ссылки на меню в 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().