안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요, 날씨도 더운데 고생이 많으십니다....
다름이 아니라 현재 버튼에 컨텍스트 메뉴를 구현하고 있습니다. 컨텍스트 메뉴에서 3가지 색을 고르면 버튼의 텍스트 색이
변경되는 것은 잘 구현이 됩니다만 저는 여기에 라디오 버튼을 추가하고 싶습니다.
검색해보니 코드 상으로 라디오 버튼을 넣는 방법이 없다는 이야기도 있고 대부분의 예제가 xml로 구현해서
일단 저도 xml로 구현했습니다. 코드는 다음의 순서로 구현했습니다.
1. 컨텍스트 메뉴를 xml로 구현
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="서브 메뉴"> // 컨텍스트 메뉴의 타이틀
<menu>
<group android:checkableBehavior="single"> // 상호배타적 선택, 즉 라디오 버튼
<item android:id="@+id/radio_red" android:title="RED" />
<item android:id="@+id/radio_green" android:title="GREEN" />
<item android:id="@+id/radio_blue" android:title="BLUE" />
</group>
</menu>
</item>
</menu>
2. 액티비티의 onCreate()에서 버튼에 컨텍스트 메뉴 등록
mBtn = (Button)findViewById(R.id.btn); // main.xml에 버튼 엘리먼트 속성이 이미 되어있음
registerForContextMenu(mBtn);
3. 액티비티에서 컨텍스트 메뉴(xml) 전개
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
if(v == mBtn)
{
// 동적으로 메뉴 전개
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
// 전개된 메뉴에서 현재 컬러와 매치된 항목의 라디오 버튼 설정
int color = mBtn.getTextColors().getDefaultColor();
switch(color)
{
case Color.RED:
menu.findItem(R.id.radio_red).setCheckable(true);
break;
case Color.BLUE:
menu.findItem(R.id.radio_blue).setCheckable(true);
break;
case Color.GREEN:
menu.findItem(R.id.radio_green).setCheckable(true);
break;
}
}
}
4. 액티비티에서 항목이 선택되었을 때의 이벤트 처리
@Override
public boolean onContextItemSelected(MenuItem item) {
switch(item.getItemId())
{
case R.id.radio_red:
mBtn.setTextColor(Color.RED);
break;
case R.id.radio_green:
mBtn.setTextColor(Color.GREEN);
break;
case R.id.radio_blue:
mBtn.setTextColor(Color.BLUE);
break;
}
return true;
}
그리고 나서 에뮬레이터서 실행 후, 버튼에 롱클릭하여 컨텍스트메뉴를 얻어오면 다음과 같은 화면이 나옵니다.


컨텍스트 헤드 타이들에 서브메뉴가 나와야 하는데 이상하게 나옵니다... 뭐 일단... 서브 메뉴를 다시 클릭하게 되면
다음과 같이 정상적으로 메뉴가 나오는데 이번엔 항목에 라디오 버튼이 선택이 안되어 있습니다.

안드로이드 개발자 사이트를 참조해 보아도 문제가 없는 듯 하고... 사이트 검색을 해보면
김상형씨의 정복 책 예제로만 도배가 되어있고... 답답합니다... 누구 아시는 분 없으신가요...