2013-02-18 5 views
5

Hallo Ich entwickle eine Android-Anwendung. In meiner Anwendung verwende ich ActionBarSherlock. I definierte einige Menüpunkte in der Aktionsleiste auf folgende Weise:Aktionsleiste Untermenü funktioniert nicht mit 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" 
/> 

Nun, alles sehr gut dargestellt, aber mein Problem ist, dass, wenn ich auf einem card_menu Elemente klicken, wo ich Unter definieren Menüs und definieren auch ein Aktionslayout; Es zeigt diese Untermenüs nicht an.
Meine anderen Menüpunkte funktionieren ordnungsgemäß. Nur wenn ich ein Aktionslayout für mein Objekt definiere, das zu diesem Zeitpunkt Untermenüs enthält, kann ich das Untermenü nicht anzeigen.
Wenn ich das Aktionslayout entferne, dann funktioniert es gut ...

Ich weiß, wenn wir ein Aktionslayout für ein Element definieren, dann müssen wir den Klicklistener manuell behandeln. Das habe ich die folgende Art und Weise:

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

Ich bin in der Lage das Click-Ereignis für dieses Element zu handhaben, aber nicht in der Lage Dropdown-Untermenüpunkte zu zeigen ..

Wie dieses Problem zu lösen? Wie kann ich meine Untermenüs öffnen?

Sie brauchen Hilfe .... Danke ...

Antwort

0

ich ähnliches Problem hatte und löste es mit einem Trick einen Spinner in der ActionBar verwenden. Also mein Layout der ActionBar in res/Menü (action_share ist wichtig):

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

In meinem res/Layout-Ordner, die ich in actionbar_spinner_export setzen:

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

Dann in der onCreateOptionsMenu, I habe diesen Spinner und füge einen benutzerdefinierten ArrayAdapter hinzu. Ich kann den Code nur in C# veröffentlichen, da ich mit Xamarin.Android Cross Platform Development arbeite. Aber seine fast das gleiche für 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"}); 

Dann in meiner benutzerdefinierten ExportAdapter ich in getView das Bild setzen, möchte ich zeigen, (in diesem Fall ein Aktiensymbol). Und in getDropDownView stelle ich alle meine Artikel ein. Hier ist der Code:

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

Auf diese Weise habe ich eine ActionBar Icon, das wie ein echter ActionBar-Element aussieht. Und wenn ich darauf klicke, werden die Objekte in meinem Spinner angezeigt.