2012-03-29 3 views
6

ICS 이전 장치에 오버플로 메뉴를 표시하기 위해 ActionBarSherlock의 주요 이벤트를 수신하는 중 흥미로운 문제가 있습니다. 사용자가 IME를 표시 할 의도로 메뉴 키를 길게 누르면 대 간단한 키 프레스를 구별 할 수없는 것처럼 보입니다. 두 KeyEvent 인스턴스는 동일하며, 다음과 같이 이러한 두 가지 이벤트를 구별 할 수있는 간단한 방법이IME에서 정규 메뉴 키 이벤트 열기

있습니까?

+0

'onPrepareOptionsMenu' 콜백을 사용하는 것이 나의 대안이지만 키 이벤트를 통해 처리하는 것을 선호합니다. –

답변

3

흠 ... 은 KEYCODE_MENU과 작동하지 않는 것 같습니다. 얼마나 짜증나.

이 넥서스 S (4.0.3)와 넥서스 원 (2.3.6)에서 작동하는 것 같다 :

public class MenuKeyDetectorActivity extends Activity { 
    boolean wasLongPress=false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     wasLongPress=wasLongPress | event.isLongPress(); 
    } 

    return(false); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_MENU) { 
     Log.w("MKD", String.format("wasLongPress: %b", wasLongPress)); 
     wasLongPress=false; 
    } 

    return(false); 
    } 
} 

기본적으로이 아닌 onKeyDown() 전화에 긴 프레스 또는인지주의, onKeyUp()에 해당 정보를 사용하여 최종 처분을 결정하십시오.

+0

이 기술을 사용하면 'onKeyEvent'와 함께 작동하고 위/아래 동작을 감지 할 수 있습니다. 왜 그렇게되지 않을지 모르겠다. 감사! –