Bucket Place/Android

[Android] Actionbar 메뉴 클릭 이벤트 / activity + fragment

Cloud Travel 2014. 11. 5. 14:44

  1. 들어가면서 


 개발 일정에 밀리고 밀려서 점점 공을 들여서 글을 쓰는 빈도가 적어지고 있다. 살짝 반성중...


 오늘은 Actionbar menu item(액션바 메뉴 아이템)을 컨트롤하는 방법에 대해서 알아보겠다. 액션바에 있는 메뉴가 Activity전체에 대해서 똑같이 움직이길 바랄때도 있을 것이고, 특정 Fragment마다 다르게 움직이길 바랄 수도 있다. 


 예를 들어서, 현재 액티비티 전체에서 검색은 공통적으로 움직이게 하고 싶지만, 공유는 각각 프레그먼트마다 다르게 움직이길 바랄 수 있다. 어떻게 하면 이 것이 가능할가? 


 이 글은 프레그먼트에 대한 개념이 잡혀있어야지 이해하기가 쉬울 것이라고 생각한다.

 아래에 나와 있는 동작 로직 및 순서를 보면 그 해답이 보이기 시작할 것이다.



  2. 프레그먼트에서 액션바 메뉴를 사용하기 위한 설정(사전작업)

 

 프레그먼트에서 액션바에 대한 권한을 가져오기 위해서는 아래와 같은 작업을 해줘야 한다.


 1) Fragment의 onCreate 메소드에 메뉴를 가지고 있다는 것을 확인시킨다.

   > setHasOptionMenu(true);

 2) onCreateOptionMenu(Menu menu, MenuInflater inflater) 메소드와 

    onOptionsItemSelected(Menu item) 메소드 오버라이드한다. 여기서 onCreateOptionMenu

    메소드에 프레그먼트에서만 사용되는 아이탬을 추가할 수 있다.

 3) Activity와 Fragment의 onOptionItemSelected 메소드를 작성해주자. 


 이 메소드를 작성하기에 앞서서 메뉴의 동작 로직 및 순서를 알아보자.



 3. 액션바 메뉴의 동작 로직 및 순서


 - 액션바에서 수행되는 아이탬 클릭 이벤트를 다루는데 두 가지 메소드가 존재하지만, 

    여기서는 onOptionItemSelected를 사용했다는 가정하에 진행하겠다.

 - onOptionItemSelected는 명령어를 수행했다면, true값을 수행하지 않았다면 false값을 반환한다. 

 - 이를 이용하여 어플리케이션 메니져는 메뉴아이탬이 클릭됬을 때 onOptionItemSelected 메소드의 

  반환값이 true가 될때까지 현재 액션바에 관련된 엑티비티와 프레그먼트를 순환하게 된다.


   




 4. 예를들어보자


 - In Activity

@Override

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.search:
        // Do Activity menu item stuff here
        return true;
    case R.id.share:
        // Not implemented here
        return false;
    default:
        break;
    }

    return false;
}


 - In Fragment

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    ....
}

@Override
public void onCreateOptionsMenu(Menu menu) {
    // Do something that differs the Activity's menu here
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.search:
        // Not implemented here
        return false;
    case R.id.share:
        // Do Fragment menu item stuff here
        return true;
    default:
        break;
    }

    return false; 

}




 5. 마무리


 위의 예제를 적용하면 각각의 프레그먼트마다 다르게 움직이는 메뉴를 구성할 수 있게 된다. 더 나아가 각각의 메뉴마다 새로운 메뉴 레이아웃을 적용하고, 메뉴를 삭제했다가 넣었다하는 작업등을 자유롭게 할 수 있다. 메뉴를 삭제하고 추가하는 작업은 fragment의 onCreateOptionMenu에서 각각의 item마다 visibility설정을 통해서 가능하게 된다.


 이와 관련해서 더 자세한 질문은 환영한다.