본문 바로가기

01. 개발/Android

OptionMenu : 보이기/숨기기

하나의 Activity에 여러가지 Fragment를 사용하면서 Option Menu까지 사용할 경우, 삽입되는 Fragment에 따라 Option Menu를 숨기거나 보이게 해야할 상황이 왕왕 발생한다. 예를 들어 List Fragment에서는 Option Menu를 표시하고서 메뉴를 이용해 정렬 방법에 따라 List를 다르게 표시할 것이다. (날짜순 정렬이라던지, 인기 순 정렬 등등) 하지만 List Item을 클릭하면 Detail Fragment를 삽입하고 해당 Fragment에서 상세 내용을 표시한다면, 이 때 Option Menu는 필요하지도 않을 뿐더러 메뉴 사용의 의미가 없어진다. 이와 같은 경우에, 각 Fragment에 따라 Option Menu를 숨기거나 보이게 처리하는 방법이 있어 소개한다. 

설명을 위해 BoardActivity(액티비티), ListFragment(목록), DetailFragment(상세보기) 라 칭한다.

 

 

01. board_menu.xml에 <group>추가

BoardActivity에서 사용할 메뉴는 res/menu 폴더에 저장되어 있을 것이다. 대략 아래의 코드와 비숫할 것이다.

 

<?xml version="1.0" encoding="utf-8"?>
<menu 
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">
  <item
    android:id="@+id/menu_1"
    android:title="작성일자"
    app:showAsAction="ifRoom"/>
  <item
    android:id="@+id/menu_2"
    android:title="댓글"
    app:showAsAction="ifRoom"/>
  <item
    android:id="@+id/menu_2"
    android:title="조회수"
    app:showAsAction="ifRoom"/>      
</menu>

위와 같은 코드에 <group>을 추가하고 각 item을 group의 하위에 재배채한다.

<?xml version="1.0" encoding="utf-8"?>
<menu 
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">
  <group android:id="@+id/board_menu_group">
    <item
      android:id="@+id/menu_1"
      android:title="작성일자"
      app:showAsAction="ifRoom"/>
    <item
      android:id="@+id/menu_2"
      android:title="댓글"
      app:showAsAction="ifRoom"/>
    <item
      android:id="@+id/menu_2"
      android:title="조회수"
      app:showAsAction="ifRoom"/>
  </group>		
</menu>

 

 

02.BoardActivity 수정

Menu 타입의 변수를 선언하고 onCreateOptionsMenu() 함수에서 해당 변수에 menu를 할당한다. 또한 Option Menu를 숨기거나 보이게 할 메서드를 작성한다.

import android.view.Menu;

public class BoardActivity extends AppCompatActivity {
	
    ...
    
    private Menu mMenu;
    
    ...
    
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		this.mMenu = menu;
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.board_menu, menu);
		return true;
	}
    
    ...
    
    
    public void showOptionMenu(boolean isShow) {
    	if(mMenu == null) {return;}
        menu.setGroupVisible(R.id.baord_menu_group, isShow);
    }

 

 

03.ListFragment 수정

	...
    
    @Override
	public void onResume() {
		super.onResume();
		((BoardActivity)getActivity()).showOptionMenu(true);
	}
    
    ...

 

 

04. DetailFragment 수정

	...
    
    @Override
	public void onResume() {
		super.onResume();
		((BoardActivity)getActivity()).showOptionMenu(false);
	}
    
    ...