2013-02-16 4 views
22

Привет, Я разрабатываю приложение для Android. В моем приложении я использую действие Шерлока. Я определил несколько пунктов меню в экшен-бар, как в следующем образомЭлемент меню панели действий Android с действиемLayout не работает должным образом

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:id="@+id/card_menu" 
     android:actionLayout="@layout/action_button" 
     android:showAsAction="always" 
     android:title="cards"> 
     <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:actionLayout="@layout/notification_icon" 
     android:icon="@drawable/notification" 
     android:showAsAction="always" 
     android:title="Notifications"/> 

    <item 
     android:id="@+id/filter" 
     android:icon="@drawable/filter" 
     android:showAsAction="always" 
     android:title="Filter"/> 
</menu> 

и мой action_button выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <ImageView 
     android:id="@+id/menu_img" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/spinner_ab_focused_maroon"/> 
    <TextView 
     android:id="@+id/menu_text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@+id/imageView0" 
     android:text="C1"/> 
</RelativeLayout> 

Теперь отображается все, но моя проблема в том, что, когда я нажимаю на card_menu item где Я определяю подменю, а также определяю макет действия. Он не показывает эти подменю. Мои другие пункты меню работают правильно. Только когда я определяю макет действия для моего элемента, который содержит подменю, которые я не могу отобразить подменю. Если я удалю макет действия, он отлично работает.

Я знаю, если мы определяем макет действия для элемента, тогда мы должны вручную обработать функцию прослушивания кликов. я сделал это в следующий способ

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

Я могу справиться щелкнуть событие для этого элемента, но не смог показать выпадающие пункты меню подменю.

Как решить эту проблему?

ответ

47

Попробуйте этот код в вашей деятельности.
Обязательно правильно установить

R.menu.menuidentifier

R.id.menuitemidentifier

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.actionbarhelpmenu, menu); 
     final Menu m = menu; 
     final MenuItem item = menu.findItem(R.id.ActionConnection); 
     item.getActionView().setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       m.performIdentifierAction(item.getItemId(), 0); 
      } 
     }); 
     return true; 
    } 
+1

Привет Ericharlow спасибо за ценную помощь .. спасибо много. ваше решение работает для меня. Я искал это решение с давних времен. Теперь единственная проблема заключается в том, что список подменю находится в правом верхнем углу.его не приходят как обычные .. Я хотел отобразить его под моей панелью действий .. Как переместить его в нужное место .. thankx снова за помощью .. – nilkash

+1

еще одна проблема заключается в том, что он не работает над более старой версией Android-устройств, которые он выполняет, но не показывать мои подменю. Как это решить. Поддерживает ли библиотека Шерлок это или нет. спасибо ... – nilkash

+1

@nilkash вам удалось использовать actionBarSherlock с пользовательским макетом для элемента action, даже на старых API-интерфейсах Android? странная вещь, которую я получаю от нее, заключается в том, что она не доступна для кликов, и когда я перехожу к другому виду, она может обрабатывать событие click, которое произошло раньше. –

6

Принимается ответ не работает для меня. Мое подменю велось на разных устройствах различно. На Motorola Moto X это было так: enter image description here

Вы можете видеть, что подменю находится в неправильном положении (я нажал на значок пузырь на праве ActionBar).

Итак, в конце я придумал другое решение: вместо этого используйте PopupMenu. код выглядит следующим образом:

@Override 
public void onCreateOptionsMenu(final Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    inflater.inflate(R.menu.menu_fragment_chat, menu); 
    final MenuItem item = menu.findItem(R.id.menu_item_actionbar_avatar); 
    MenuItemCompat.getActionView(item).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      showProfileMenuPopup(v); 
     } 
    }); 
} 

public void showProfileMenuPopup(View v) { 
    PopupMenu popup = new PopupMenu(getActivity(), v); 
    MenuInflater inflater = popup.getMenuInflater(); 
    inflater.inflate(R.menu.menu_avatar_actions, popup.getMenu()); 
    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
     @Override 
     public boolean onMenuItemClick(MenuItem menuItem) { 
      return false; 
     } 
    }); 
    popup.show(); 
} 

И это сработало :)

+1

Это ошибка в структуре, см. Https://github.com/android/platform_frameworks_base/blob/kitkat-release/core/java/com/android/internal/view/menu/ActionMenuPresenter.java#L269 Вы, ll заметить, что он пытается найти представление для элемента по его данным элемента только с помощью внутреннего интерфейса. Если он не найден, по умолчанию будет выбрана кнопка переполнения, которая, если она не существует, всплывает по умолчанию по 0,0. Добавьте элемент только для переполнения текста, и вы увидите, что он работает нормально. Он должен по умолчанию использовать ItemItem ActionView для всплывающего Anchor View, если он существует. Ах хорошо. Мое предложение, переключитесь на панель инструментов. – Simon

+0

@Simon не было панели инструментов в апреле 2014 года :) – agamov

0

Обратитесь к answer

Если есть кнопка в макете действий, для того, чтобы получить функцию обратного вызова из пункта меню , не забудьте установить кнопку

android:clickable="false" 
0

Полный рабочий код

<item 
    android:title="search" 
    android:id="@+id/mSearch" 
    app:actionLayout="@layout/my_custom_menu_item" 
    android:orderInCategory="100" 
    app:showAsAction="always"/> 

Код:

@Override 
public boolean onCreateOptionsMenu(final Menu menu) { 
    getMenuInflater().inflate(R.menu.menu,menu); MenuItem item = menu.findItem(R.id.mSearch); 
    ImageView iv= (ImageView) item.getActionView().findViewById(R.id.search_1); 
    iv.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(context, "clicked", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    return true; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^