android actionbarsherlock android-actionbar toast long-press

android - Ocultación de la tostada para una pulsación larga en el elemento de la barra de acción



actionbarsherlock android-actionbar (9)

Así es como lo hice:

@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); MenuItem item = menu.findItem(R.id.no_toast); item.setActionView(R.layout.custom_view); item.getActionView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //handle click (just this item) } }); return true; }

y este es mi menu:

<?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:title="Never gonna see me in a toast!" app:showAsAction="always" android:id="@+id/no_toast" /> </menu>

Mi vista personalizada es solo un ImageButton :

<?xml version="1.0" encoding="utf-8"?> <ImageButton xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" style="@style/Widget.AppCompat.Toolbar.Button.Navigation" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/icon" />

Nota: no olvide configurar el estilo, Widget.AppCompat.Toolbar.Button.Navigation hace que IamgeButton se muestre correctamente en la barra de herramientas.

PD: Personalmente prefiero el comportamiento predeterminado, pero este fue mi caso: deshabilité la compatibilidad de derecha a izquierda para mi aplicación y, después, cuando configuré la configuración regional predeterminada en un idioma rtl , ¡el brindis se estaba mostrando en el lado equivocado! Sinceramente, tenía prisa y no descubrí la razón, pero apreciaré si alguien me hizo saber la razón, de todos modos así es como pasé.

¿Hay alguna forma posible de ocultar el brindis después de una pulsación larga en el elemento ActionBar? No configuré un título para el artículo pero aún está allí: tostada vacía.

<item android:id="@+id/ab_main_menu_dots" android:icon="@drawable/action_icons_dots" android:showAsAction="always"> <menu> <item android:id="@+id/ab_main_menu_my_profile" android:showAsAction="never" android:title="@string/ab_my_profile"> </item> <item android:id="@+id/ab_main_menu_settings" android:showAsAction="never" android:title="@string/menu_settings"> </item> <item android:id="@+id/ab_main_menu_help" android:showAsAction="never" android:title="@string/tv_help_login"> </item> <item android:id="@+id/ab_main_menu_about_us" android:showAsAction="never" android:title="@string/ab_about_us"> </item> <item android:id="@+id/ab_main_menu_logout" android:showAsAction="never" android:title="@string/bt_logout_main"> </item> </menu> </item>


En onCreateOptionsMenu programe una tarea para deshabilitar, haga clic en el elemento del menú deseado. Aquí está la muestra.

@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.my_menu, menu); new Handler().post(new Runnable() { @Override public void run() { final View v = getActivity().findViewById(R.id.your_menu_item); if (v != null) { v.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { return false; } }); } } }); }


Hay una forma, si estás usando ActionBarSherlock. Encuentre el archivo ActionMenuItemView.java en la biblioteca y simplemente comente todo el método onLongClick.


La única forma de ocultar el brindis es cuando configura el ActionBar menú ActionBar para que se muestre con texto. android:showAsAction="withText" . De lo contrario, el brindis agrega una aclaración de lo que representa cada elemento de acción, incluso si no hay un conjunto de títulos para el elemento de menú.


Para mi la solución estaba usando:

android.support.v4.view.MenuItemCompat

Así que en lugar de inflar el menú del XML:

@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.refresh_menu, menu); return true; }

Creé los artículos programáticamente usando MenuItemCompat:

@Override public boolean onCreateOptionsMenu(Menu menu) { MenuItem refreshItem = menu.add(Menu.NONE, R.id.menu_item_refresh, Menu.NONE, R.string.general_pop_up_dialog_btn_cancel); MenuItemCompat.setActionView(refreshItem, R.layout.actionbar_custom_view_refresh); MenuItemCompat.setShowAsAction(refreshItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS); return true; }



Probablemente, la forma más limpia de hacerlo es asignar una vista de acción personalizada a su elemento de menú que imite la apariencia de una normal.

Como mencionó que está usando ActionBarSherlock, aquí tiene un ejemplo simple.

Imagine el siguiente menu.xml , que se infla en una Activity .

<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/ab_main_menu_dots" android:actionLayout="@layout/ab_main_menu_dots_layout" android:showAsAction="always"/> </menu>

Puede definir ab_main_menu_dots_layout.xml para imitar el botón de desbordamiento así:

<ImageButton xmlns:android="http://schemas.android.com/apk/res/android" style="@style/Widget.Sherlock.ActionButton.Overflow" android:layout_width="match_parent" android:layout_height="match_parent" />

El resultado es un elemento del menú que parece un botón de desbordamiento y no muestra un mensaje de Toast cuando lo presiona durante un tiempo prolongado, independientemente de si se utiliza la barra de acción nativa o ABS. Depende de usted para tomarlo desde aquí. Desea reconsiderar y acatar las directrices en su lugar.


Puede modificar onLongClick en ActionMenuItemView Class para detener Toasting con un clic largo.
pero tenga cuidado, solo funciona en dispositivos con API de menos de 11, ya que la biblioteca sherlockactionbar comprueba el nivel de API de su dispositivo mediante Build.VERSION.SDK_INT y si tiene un dispositivo más nuevo, simplemente use la barra de acción predeterminada del sistema que no está modificando.


Puedes lograr esto usando la vista de acción personalizada de la siguiente manera:

action_menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:support="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/item1" support:showAsAction="always"> </item> </menu> custom_action_view.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" android:paddingRight="5dp" > <ImageButton android:id="@+id/customActionItem" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:background="@drawable/abc_item_background_holo_dark" android:src="@drawable/bulb_icon" /> </RelativeLayout>

y el código de inflado del menú es el siguiente:

public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.action_menu, menu); final MenuItem item1= menu.findItem(R.id.item1); MenuItemCompat.setActionView(item1, R.layout.custom_action_view); View vItem1= MenuItemCompat.getActionView(item1); final ImageButton customActionItem= (ImageButton) vItem1.findViewById(R.id.customActionItem); customActionItem.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // do something here } }); return super.onCreateOptionsMenu(menu); }