2013-02-18 12 views
5

Witam Zajmuję się tworzeniem aplikacji na Androida. W mojej aplikacji używam ActionBarSherlock. I zdefiniowano kilka pozycji menu w akcji-bar, w następujący sposób:Podmenu paska czynności nie działa z 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" 
/> 

Teraz wszystko wyświetlanego bardzo dobrze, ale moim problemem jest to, że po kliknięciu na elemencie card_menu gdzie mogę zdefiniować sub menu, a także zdefiniować układ działania; nie pokazuje tych podmenu.
Moje inne pozycje w menu działają poprawnie. Tylko wtedy, gdy zdefiniuję układ akcji dla mojego elementu, który zawiera podmenu w tym czasie, nie jestem w stanie wyświetlić podmenu.
Po usunięciu układu czynności, działa poprawnie ...

Wiem, że jeśli zdefiniujemy układ działania dla elementu, musimy ręcznie obsłużyć odbiornik kliknięć. Zrobiłem to w następujący sposób:

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

Jestem w stanie obsłużyć zdarzenia click dla tego elementu, ale nie jest w stanie pokazać elementy menu rozwijane sub ..

Jak rozwiązać ten problem? Jak mogę otworzyć moje podmenu?

Potrzebna pomoc .... Dziękuję ...

Odpowiedz

0

miałem podobny problem i rozwiązać go z wykorzystaniem trick Spinner wewnątrz Actionbar. Więc mój układ actionbar w res/menu (action_share ma znaczenia):

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

W moim res folderze/Layout, kładę w 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" /> 

Następnie w onCreateOptionsMenu, ja dostałem ten spinner i dodałem do tego niestandardowy ArrayAdapter. Mogę tylko opublikować kod w języku C#, ponieważ pracuję z Xamarin.Android Cross Platform Development. Ale jej prawie taka sama dla 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"}); 

Wtedy w moim niestandardowego ExportAdapter, kładę w getView obraz, chcę pokazać (w tym przypadku akcja-ikona). I w getDropDownView umieszczam wszystkie moje przedmioty. Oto kod:

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

W ten sposób mam ikonę paska czynności, który wygląda jak prawdziwy element actionbar. A kiedy go klikę, pojawią się elementy w mojej tarczy.

Powiązane problemy