2013-02-18 22 views
5

Ciao Sto sviluppando un'applicazione Android. Nella mia applicazione sto usando ActionBarSherlock. Ho definito alcune voci di menu nell'azione-bar, nel seguente modo:Il sottomenu della barra delle azioni non funziona con actionLayout

<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" 
/> 

Ora, tutto visualizzato molto bene, ma il mio problema è che quando clicco su un elemento card_menu dove mi definisco sub menu e anche definire un layout di azione; non mostra quei sottomenu.
Le altre voci di menu funzionano correttamente. Solo quando definisco un layout di azione per il mio oggetto che contiene sottomenu in quel momento non riesco a visualizzare il sottomenu.
Se rimuovo il layout azione, allora sta funzionando bene ...

So che se definiamo un layout d'azione per una voce, quindi dobbiamo gestire manualmente il clic ascoltatore. L'ho fatto nel modo seguente:

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

sono in grado di gestire l'evento click per tale voce, ma non in grado di mostrare le voci di menu sub discesa ..

Come risolvere questo problema? Come posso aprire i miei sottomenu?

bisogno di assistenza .... Grazie ...

risposta

0

ho avuto problema simile e risolto con un trucco utilizzando uno Spinner all'interno del ActionBar. Quindi il mio layout del ActionBar in res/menù è (action_share è importante):

<item android:id="@+id/action_share" 
    android:showAsAction="always" 
    android:actionLayout="@layout/actionbar_spinner_export" /> 

Nella mia cartella res/layout, ho messo in 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" /> 

Poi nel onCreateOptionsMenu, ho ottenuto questo spinner e aggiungere un ArrayAdapter personalizzato a questo. Posso solo pubblicare il codice in C#, dal momento che sto lavorando con Xamarin.Android Cross Platform Development. Ma la sua quasi lo stesso per 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"}); 

Poi nel mio ExportAdapter personalizzato, ho messo in GetView l'immagine, voglio mostrare (in questo caso una quota-icona). E in getDropDownView, ho messo tutti i miei oggetti. Ecco il codice:

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

In questo modo, ho un icona ActionBar, che si presenta come un vero e proprio ActionBar-item. E quando clicco su di esso, ci saranno gli oggetti nella mia selezione.