2013-01-13 48 views
2

我有一個ActionBar並設置爲顯示對ActionBar一些像這樣的菜單項:Android操作欄菜單項長按檢測可能嗎?

<item 
     android:id="@+id/menu_play1" 
     android:orderInCategory="100" 
     android:showAsAction="ifRoom|withText" 
     android:title="Play1x"/> 

onOptionsItemSelected(MenuItem item)工作正常捕正常點擊,但我想搭上長按這樣我就可以可以做與正常印刷的默認行爲不同。

這可能嗎?如何?謝謝。

+0

只與自定義操作視圖可能,看http://stackoverflow.com/a/9261497/1018177 –

+0

該帖子在細節上略顯淡化,但此http://developer.android.com/guide/topics/ui/actionbar.html#ActionView看起來很有趣。如果我弄明白了,我會發布一些代碼 – steveh

回答

0

在MenuItems上長時間按下不是好辦法。

使用Java反射機制試圖使其成爲可能:

private interface OnMenuItemLongClickListener{ 
     boolean onMenuItemLongClik(MenuItem m); 
    } 
    private void getMenuItemsView(Activity a, final Menu m, final OnMenuItemLongClickListener listener) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException{ 
     View homeButton = a.findViewById(android.R.id.home); 
     ViewParent parentOfHome = homeButton.getParent().getParent(); //ActionBarView is parent of home ImageView, see layout file in sources 

     if (!parentOfHome.getClass().getName().contains("ActionBarView")) { 
      parentOfHome = parentOfHome.getParent(); 
      Class absAbv = parentOfHome.getClass().getSuperclass(); //ActionBarView -> AbsActionBarView class 
      Field actionMenuPresenterField = absAbv.getDeclaredField("mActionMenuPresenter"); 
      actionMenuPresenterField.setAccessible(true); 
      Object actionMenuPresenter = actionMenuPresenterField.get(parentOfHome); 
      Field actionMenuViewField = actionMenuPresenter.getClass().getSuperclass().getDeclaredField("mMenuView"); 
      actionMenuViewField.setAccessible(true); 
      Object actionMenuView = actionMenuViewField.get(actionMenuPresenter); 
      Field childrenField= actionMenuView.getClass().getSuperclass().getSuperclass().getDeclaredField("mChildren"); 
      childrenField.setAccessible(true); 
      Field menuField =actionMenuPresenter.getClass().getSuperclass().getDeclaredField("mMenu"); 
      menuField.setAccessible(true); 
      Object menu = menuField.get(actionMenuPresenter); 
      Object[] menuItemsAsViews = (Object[])childrenField.get(actionMenuView); 
      View.OnLongClickListener longListener = new View.OnLongClickListener() { 

       @Override 
       public boolean onLongClick(View v) { 

        return listener.onMenuItemLongClik(m.findItem(v.getId())); 
       } 
      }; 
      for(Object menuView:menuItemsAsViews){ 
       View v = (View)menuView; 
       v.setOnLongClickListener(longListener); 
      } 


    } 
} 

您可以通過以下要點得到這樣的:https://gist.github.com/NikolaDespotoski/6978883