본문 바로가기

안드로이드

[안드로이드] 네비게이션바 백키 기능 변경

안드로이드 기기 화면 하단에 보면 요 뒤로가기 기능을 가진 버튼이 있습니다.

 

혼자 알아서 앱도 꺼주고 해서 편하지만, 앱 개발 시 "어플을 종료하시겠습니까?" 라는 팝업창을 띄우거나 기능을 변경해야할 때가 있습니다. 이럴 때 바로 onKeyDown()@override 하면 됩니다.

onKeyDown은 키가 눌렸을 시 반응하는 함수입니다. 백문이 불여일견!

 

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    Log.d(TAG, "onKeyDown");
    return super.onKeyDown(keyCode, event);
}

백키 나 볼륨 업/다운 키를 누르면 로그가 찍히는 것을 확인할 수 있습니다.

super.onKeyDown(keyCode, event)를 사용하면 원래 기능을 작동시킵니다.

 

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    Log.d(TAG, "onKeyDown");
  
    return super.onKeyDown(keyCode, event);
}

 

만약 다른 기능을 하고 싶으면 

 

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    Log.d(TAG, "onKeyDown");
    
    //기능 추가
    
    return true;
}

 

이렇게 하시면 됩니다. 리턴값에 대한 설명을 보면

 

/**
* @return Return <code>true</code> to prevent this event from being propagated
* further, or <code>false</code> to indicate that you have not handled
* this event and it should continue to be propagated.
* @see #onKeyUp
* @see android.view.KeyEvent
*/

true 면 이벤트가 전파되는 것을 막고

false 면 이벤트 전파가 진행된다고 되어 있습니다.

이벤트 전파는 이제 onKeyDown 이후에 시스템적으로 핸들하는 기능들이 더 있는데, 그걸 막을지 말지 정하는것 같더라고요. 즉, 딱 내가 원하는 기능만 시킬려면 true 로 하시면 될 듯합니다. 저도 이 부분에 대한 상황을 마주한 적이 없어서 정확한 답을 내리기 애매하네용;;;

 

그래서! 사용할 수 있는 또 다른 메소드가 있습니다.

바로바로 onBackPressed() 라는 녀석입니다.

 

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    Log.d(TAG, "onKeyDown");
  
    return super.onKeyDown(keyCode, event);
}

@Override
public void onBackPressed() {
    Log.d(TAG, "onBackPressed");
    
    super.onBackPressed();
}

 

 

로그를 확인하면 onKeyDown을 거쳐서 onBackPressed으로 오는 것을 확인 할 수 있습니다.

 

onBackPressed에서 백키를 막고 싶으면

@Override
public void onBackPressed() {
    Log.d(TAG, "onBackPressed");
    
    //기능
    
    //super.onBackPressed();
}

super를 막고 기능을 추가하면 됩니다.

 

어디든 편한데서 고치면 될 것 같습니다!