El submenú de la barra de acción no funciona con actionLayout
Hola Estoy desarrollando una aplicación para Android. En mi aplicación estoy usando ActionBarSherlock. He definido algunos elementos de menú en la barra de acción, de la siguiente manera:
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/card_menu" android:title="cards" android:showAsAction="always" android:actionLayout="@layout/action_button" > <menu> <item android:id="@+id/C1" android:title="C1" /> <item android:id="@+id/C2" android:title="c2" /> <item android:id="@+id/C3" android:title="C3" /> </menu> </item> <item android:id="@+id/notification" android:title="Notifications" android:showAsAction="always" android:actionLayout="@layout/notification_icon" android:icon="@drawable/notification" /> <item android:id="@+id/filter" android:icon="@drawable/filter" android:title="Filter" android:showAsAction="always" />
Ahora, todo se muestra muy bien, pero mi problema es que cuando hago clic en un elemento card_menu en el que defino submenús y también definir un diseño de acción; No muestra los submenús.
Mis otros elementos del menú están funcionando correctamente. Sólo cuando defino un diseño de acción para mi elemento que contiene submenús en ese momento no puedo mostrar el submenú.
Si quito la disposición de la acción, entonces está trabajando muy bien …
- Cómo crear menú emergente como submenú de otro elemento de menú de menú emergente
- Android añadiendo un submenú a un menuItem, donde es addSubMenu ()?
- Android cómo poner el submenú dentro del submenú
- ¿Cómo agregar divisores entre elementos de menú específicos?
- Android - ActionBarSherlock - Establecer textcolor de texto en el menú
Sé que si definimos un diseño de acción para un elemento, entonces tenemos que manejar manualmente el oyente de clics. Lo hice de la siguiente manera:
final MenuItem item = menu.findItem(R.id.card_menu); item.getActionView().setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { onOptionsItemSelected(item); Toast.makeText(getActivity(), "click on menu", Toast.LENGTH_SHORT).show(); } });
Soy capaz de manejar el evento de clic para ese elemento, pero no puedo mostrar elementos del submenú desplegable.
¿Cómo resolver este problema? ¿Cómo puedo abrir mis submenús?
Necesito ayuda …. Gracias …
- Barra de acciones - elemento del submenú con texto e imagen no funcionando correctamente
- Elemento de menú de la barra de acción Android con actionLayout no funciona correctamente
- Cómo crear un submenú para el botón de acción flotante en Android Material Design?
- Cómo cambiar la sangría de los elementos del submenú en un NavigationView?
- ActionBarSherlock: abre el submenú con el botón de menú
- ¿Agregar un onclick a un submenú?
- Cómo crear un submenú personalizado como la aplicación de Google Chrome
Tuve un problema similar y lo resolví con un truco usando un Spinner dentro de la barra de acción. Así que mi diseño de la barra de acción en res / menu es (action_share es importante):
<item android:id="@+id/action_share" android:showAsAction="always" android:actionLayout="@layout/actionbar_spinner_export" />
En mi carpeta res / layout, pongo en actionbar_spinner_export:
<Spinner xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/sp_export" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/actionbar_item_selector" />
Entonces en el onCreateOptionsMenu, conseguí este hilandero y agrego un ArrayAdapter a esto. Sólo puedo publicar el código en c #, ya que estoy trabajando con Xamarin.Android Cross Platform Development. Pero es casi lo mismo para Java:
IMenuItem spinnerExport = menu.FindItem(Resource.Id.action_share); _sp_export = spinnerExport.ActionView.FindViewById<Spinner>(Resource.Id.sp_export); _sp_export.Adapter = new ExportAdapter(_parent, Resource.Layout.actionbar_export_row, new List<String>{"Drucken", "Als PDF", "Als Text", "Als Tabelle"});
Entonces en mi costumbre ExportAdapter, puse en getView la imagen, quiero mostrar (en este caso un icono de compartir). Y en getDropDownView, pongo todos mis artículos. Aquí está el código:
class ExportAdapter : ArrayAdapter { private List<String> _objects = null; private Context _context = null; public ExportAdapter(Context context, int resourceId, List<String> objects) : base(context, resourceId) { _context = context; _objects = objects; } public override View GetView (int position, View convertView, ViewGroup parent) { convertView = ((Activity) _context).LayoutInflater.Inflate(Resource.Layout.actionbar_export_row, parent, false); TextView tv_text = convertView.FindViewById<TextView>(Resource.Id.tv_text); ImageView iv_image = convertView.FindViewById<ImageView>(Resource.Id.iv_image); RelativeLayout.LayoutParams lp_iv = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WrapContent, RelativeLayout.LayoutParams.WrapContent); lp_iv.AddRule(LayoutRules.CenterInParent); iv_image.LayoutParameters = lp_iv; iv_image.SetPadding(5,5,5,5); tv_text.Visibility = ViewStates.Gone; iv_image.SetImageResource(Resource.Drawable.ic_action_share); return convertView; } public override View GetDropDownView (int position, View convertView, ViewGroup parent) { convertView = ((Activity) _context).LayoutInflater.Inflate(Resource.Layout.actionbar_export_row, parent, false); TextView tv_text= convertView.FindViewById<TextView>(Resource.Id.tv_text); tv_text.Text = _objects.ElementAt(position); return convertView; } public override int Count { get { return _objects.Count(); } } public String getItemAtIndex(int position) { return _objects.ElementAt(position); } }
De esta manera, tengo un Icono de barra de acciones, que se parece a un ítem de acción real. Y cuando hago clic en él, habrá los artículos en mi hilandero que aparece.