본문 바로가기
호구지책/Java/Android

[안드로이드] 옵션 메뉴 처리하기

by 하늘의흐름 2015. 12. 1.
반응형

옵션 메뉴에 대해서 그 것이 있다고만 알고 있었지

활용한 기억이 거의 없었다.


요번에 어플을 제작하는데, 옵션 메뉴를 활용하려고 보니, 이 메뉴 값이

한번 잡히면 변경이 되지 않아서 몇시간 동안 삽질을 했다.


이상하서 메뉴에 관해서 검색을 해보니, 원래 onCreateOptionsMenu메서드는 한번만

실행한다는 점을 깜빡 잊고 있었다.

(Create가 들어가는 메서드는 1회 호출이라고 생각하면 편할 것 같다.)


반면에 onPrepareOptionsMenu메서드는 옵션메뉴를 호출할 때마다

실행이 된다. 즉 이 메서드를 통해 메뉴의 내용도 변경이 가능한 것이다.


단순하게 다음과 같은 코드로 구성해 보았다.

 
@Override
	    public boolean onCreateOptionsMenu(Menu menu) {
	        super.onCreateOptionsMenu(menu);  
	        return true;
	    }
	
	    @Override
	    public boolean onPrepareOptionsMenu(Menu menu){  
	    	menu.removeItem(1); 
	    	String version = "";
			try { 
			PackageInfo i = getPackageManager().getPackageInfo(getPackageName(), 0); 
			version = i.versionName; 
			//t_version.setText("현재버전:"+version);
			} catch(NameNotFoundException e) { }
		    menu.add(0,1,0,"현재버전:"+version); 
	        return super.onCreateOptionsMenu(menu); 
	    }
	     
	    @Override
	    public boolean onOptionsItemSelected(MenuItem item) {
	        switch (item.getItemId()) {
	        case 1:  
	        	Toast.makeText(getApplicationContext(), "현재 설치된 버전입니다.", 
Toast.LENGTH_SHORT).show();
	            return true; 
	        }
	        return false;
	    }   

하지만 조금 아쉬운 점이 있었다.

모든 엑티비티에서 이 옵션메뉴를 공통적으로 써야하는데,

일일이 카피해줄 수는 없는 노릇이다라는 생각이 들었던 것.


마침, 검색을 통해서 CommonActivity를 작성해서

그녀석을 상속(extend)받아 사용하면 시간도 코드도 절약하여

작성할 수 있다는 것을 알았다.

 
public class BaseActivity extends Activity {
@Override
	    public boolean onCreateOptionsMenu(Menu menu) {
	        super.onCreateOptionsMenu(menu);  
	        return true;
	    }
	
	    @Override
	    public boolean onPrepareOptionsMenu(Menu menu){  
	    	menu.removeItem(1); 
	    	String version = "";
			try { 
			PackageInfo i = getPackageManager().getPackageInfo(getPackageName(), 0); 
			version = i.versionName; 
			//t_version.setText("현재버전:"+version);
			} catch(NameNotFoundException e) { }
		    menu.add(0,1,0,"현재버전:"+version); 
	        return super.onCreateOptionsMenu(menu); 
	    }
	     
	    @Override
	    public boolean onOptionsItemSelected(MenuItem item) {
	        switch (item.getItemId()) {
	        case 1:  
	        	Toast.makeText(getApplicationContext(), "현재 설치된 버전입니다.",
 Toast.LENGTH_SHORT).show();
	            return true; 
	        }
	        return false;
	    }    

}


BaseActivity라는 껍데기를 만든 것이다.

이제 다른 엑티비티에도 Activity대신에 BaseActivity를 상속받아서 사용하면 되는 것이다.

뭐. ListActivity처럼 비슷한 녀석인데 조금 다른 녀석이 있다면

거기에 해당하는 BaseActivity를 만들어 동일하게 처리해줌으로써

이 이슈를 해결할 수 있다.


반응형

댓글