2014-03-18 2 views
0

터치 할 때 무언가를하는 을 내 ActionBar에 갖고 싶습니다.작업 표시 줄 버튼이 터치 이벤트에 응답하지 않습니다.

private Button mButton; 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    mButton = (Button) getLayoutInflater().inflate(R.layout.action_button, null); 

    mButton.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent e) { 
      Log.d(TAG, "This line never executes..."); 
      return false; 
     } 
    } 

    menu.getItem(0).setActionView(mButton); 

    return super.onPrepareOptionsMenu(menu); 
} 

위에서 설명한대로 버튼을 터치하면 onTouch에서 아무 것도 발생하지 않습니다. 같은 메뉴에 다른 버튼이 있는데 (getItem(1)) 버튼이 정상적으로 작동하는 방식으로 설정되어 있습니다 (onClickListener). 제대로 작동합니다.

무엇이 누락 되었습니까?

답변

1

ActionMenuPrestenerActionBar에 나타나는 메뉴를 제어하는 ​​내부 클래스입니다. MenuItem에 하위 메뉴가있는 경우 View.OnTouchListener을 붙이면 사용자가 손가락을 앞으로 드래그하여 하위 메뉴를 열 수 있습니다. MenuItem에 하위 메뉴가 없으면 View.OnTouchListenernull으로 설정합니다.

즉, View.OnTouchListenerMenuItem에 첨부 할 수 없으므로 프레임 워크에서 제거합니다. 가장 좋은 방법은 ActionBar에 대한 맞춤 설정 인 View을 작성한 다음 View.OnTouchListener을 첨부하는 것입니다.

If you'd like to view the source for the ActionMenuPrestener, you can do so here.

+0

나는이 대답을 누락 사과가. 이 기능에 대한 UI가있는 다른 경로를 끝내었지만,이 기능이 작동하지 않는 이유와 작동하도록하려면 어떻게해야하는지에 대한 대답이 나와 있으므로 받아 들일 것입니다. – sigmabeta

1

그것을 할 수있는 간단한 방법이있다 :

  @Override 
      public boolean onCreateOptionsMenu(Menu menu) { 
       MenuItem yourItem = menu.add("Your_item"); 
       yourItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 
       View yourItemView = new ImageView(this); 
       yourItemView.setBackground(ContextCompat.getDrawable(this, R.drawable.your_icon_drawable)); 
       yourItem.setActionView(yourItemView); 
       yourItemView.setOnTouchListener(new View.OnTouchListener() { 
        @Override 
        public boolean onTouch(View view, MotionEvent motionEvent) { 
         switch (motionEvent.getAction()){ 
          case MotionEvent.ACTION_DOWN: 
           Log.d(TAG, "ACTION_DOWN"); 
           // do your touch stuff here 
           break; 
          case MotionEvent.ACTION_UP: 
           Log.d(TAG, "ACTION_UP"); 
           // do your release stuff here 
           break; 
         } 
         return true; 
        } 
       }); 
      } 
관련 문제