2012-07-24 13 views
31

Bir menü öğesinde actionLayout kullanılırken onOptionsItemSelected yöntemine çağrılmadı. Bir şey eksik mi, yoksa SherlockActionBar ile bilinen bir sorun mu?onOptionsItemSelected actionLayout (SherlockActionBar) kullanırken çağrılmadı

Etkinlik

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getSupportMenuInflater(); 
    inflater.inflate(R.menu.article, menu); 

    super.onCreateOptionsMenu(menu); 

    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    Log.d(TAG, "onOptionsItemSelected()"); 

    switch (item.getItemId()) {   
     case android.R.id.home:    
      finish();  
      return true; 
     case R.id.menu_item_comment: 
      return true; 
     default:    
      return super.onOptionsItemSelected(item);  
    } 
} 

Menü iyi

<item android:id="@+id/menu_item_comment" 
    android:showAsAction="ifRoom" 
    android:actionLayout="@layout/action_bar_comment_layout"/> 

+0

'@ layout/action_bar_comment_layout' nasıl görünüyor? –

cevap

40

, sen geri arama almanız bu actionLayout üzerinde OnClickListener ayarlamak gerekir. Ben böyle yapmak:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getSupportMenuInflater().inflate(R.menu.map_menu, menu); 
    for (int i = 0; i < menu.size(); i++) { 
     MenuItem item = menu.getItem(i); 
     if (item.getItemId() == R.id.menu_more) { 
      itemChooser = item.getActionView(); 
      if (itemChooser != null) { 
       itemChooser.setOnClickListener(this); 
      } 
     } 
    } 
    return super.onCreateOptionsMenu(menu); 
} 
+15

iyi çalıştı, teşekkürler. Btw, tüm Menü öğeleriyle yinelemek yerine findItem'i kullanabilirsiniz – user634545

+4

Bunu kısaltabilir: public boolean onCreateOptionsMenu (Menü menüsü) { getSupportMenuInflater(). Inflate (R.menu.map_menu, menu); menu.findItem (R.id.menu_more) .getActionView() setOnClickListener (bu.); return super.onCreateOptionsMenu (menü); } – roflharrison

+1

MenuItemCompat.getActionView (öğe) actionbarcompat ile kullanılmalıdır. – Sver

9

Sen MenuItemCompat.getActionView (Menuıtem) kullanmalıdır; item.getActionView() yerine; Eski sürüm için geliştiriyorsanız.

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu, menu); 
     for (int i = 0; i< menu.size() ;i++) { 
      MenuItem menuItem = menu.getItem(i); 
      if (menuItem.getItemId() == R.id.add_item) { 
       View view = MenuItemCompat.getActionView(menuItem); 
       if (view != null) { 
        view.setOnClickListener(new OnClickListener() { 

         @Override 
         public void onClick(View v) { 
          Intent intent = new Intent(MainActivity.this, ToDoActivity.class); 
          startActivity(intent); 
         } 
        }); 
       } 
      } 
     }  
     return true; 
    } 
6

Sen OnClickListener kendi ekleyin ve açıkça onOptionsItemSelected aramak gerekecek:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuItem awesomeMenuItem = menu.findItem(R.id.action_awesome); 
    View awesomeActionView = menuItem.getActionView(); 
    awesomeActionView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onOptionsItemSelected(awesomeMenuItem)); 
     } 
    }); 
} 

P.S.: Bu kutunun dışında çalışmıyor neden olduğunu bilmiyorum.

0
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getMenuInflater().inflate(R.menu.main, menu); 
    View view = menu.findItem(R.id.menu_item_comment).getActionView(); 
    view.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // do something 
     } 
    }); 
    return true; 
} 
Ayrıca

, (ve bu benim için çok önemliydi, bu yüzden diğer cevaplar işe yaramadı) Eğer eylem düzeninde tüm görünümlerle (yani action_bar_comment_layout.xml vardır) ait tıklanabilir seçeneği devre dışı bırakmanız gerekir:

android:clickable="false" 
1

@Arun Kumar'ın ve @ Luten'in yanıtlarını birleştiren, aşağıdaki yöntem, uygulamayı jenerik hale getirecektir. actionView kullanarak tüm menü öğeleri için setOnClickListener set onOptionsItemSelected (öğe) numaralı telefonu arayın. Bu şekilde, normal ve actionLayout menü öğelerini tek tek onClickListeners'ı ayarlama konusunda endişelenmeden karıştırabilir ve eşleştirebiliriz.

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    menu.clear(); 
    inflater.inflate(menuResourceId(), menu); 

    for (int i = 0; i < menu.size(); i++) { 
     final MenuItem item = menu.getItem(i); 
     View actionView = MenuItemCompat.getActionView(item); 
     if (actionView != null) { 
      actionView.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v){ 
        onOptionsItemSelected(item); 
       } 
      }); 
     } 
    } 

    super.onCreateOptionsMenu(menu, inflater); 
} 
+0

Çok iyi - teşekkürler ton! Üzgünüz, böyle bir parçacığa ihtiyacımız var ve çerçeve kendi başına dahil etmiyor ... –

İlgili konular