마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

OnMenuItemclickListener리스너를 사용하는데, Toast.makeText()메서드에서 왜 오류가 나는지 알고 싶습니다.

0 추천

 

 

 

package com.android.example.mechanics;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.Toast;

public class ActionBarMechanics extends Activity {
	MenuItem normalItem;
	@Override
	    protected void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
	    }

	    @Override
	    public boolean onCreateOptionsMenu(Menu menu) {
	        MenuItem normalItem = menu.add("Normal item");//menu.add()메서드를 통해서는 메뉴 자체에 리스트가 추가 된다.
	        MenuItem actionItem = menu.add("Action Button 공유^^");//menu.add()메서드를 통해서는 메뉴 자체에 리스트가 추가 된다.
	        
	        actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);//메뉴자체말고 actionItem객체에 대해 옆에 따로 버튼이 하나 더 생기도록 만든다.
	        actionItem.setIcon(android.R.drawable.ic_menu_share);//공유 모양의 아이콘으로 actionItem을 설정한다.
	        actionItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener(){
	        	@Override
				public boolean onMenuItemClick(MenuItem mi){
	    	        Toast.makeText(this, "Selected Item: " + mi.getTitle(),Toast.LENGTH_SHORT).show();
	        		return true;
	        	}
	        });
	        this.normalItem = normalItem;
	        return true;
	    }
	    
	    @Override
	    public boolean onOptionsItemSelected(MenuItem item) {//메뉴의 item을 선택했을 때 호출되는 메서드
	    	if (item == normalItem)
	        Toast.makeText(this, "Selected Item: " + item.getTitle(), Toast.LENGTH_SHORT).show();
	        return true;
	    }
}

액션바에 메뉴를 추가하는 것을 공부하고 있습니다. 원래 소스는 onOptionsItemSelected(MenuItem item) 메서드를 이용하여 액션바의 메뉴아이템을 클릭할 경우 Toast를 "Selected Item:" +item.getTitle() 과 같이 띄우도록 되어있었습니다.

여기다가 기존에 배웠던 Listener를 적용시켜서 보려고 했습니다.

actionItem메뉴아이템을 클릭할 경우 OnMenuItemClickListener를 통해 onMenuItemClick()메서드가호출되도록 수정하였고,

normalItem메뉴아이템을 클릭할 경우 onOptionsItemSelected()메서드가 호출되도록 유지하였습니다.

 

MenuItem actionItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener(){@오버라이드public boolean onMenuItemClick(MenuItem mi){/*토스트발생*/}})

 

위와 같이 MenuItem actionItem 이라는 변수에 리스너를 세팅하는데, 왜 아래에 onOptionItemSeclected()에서의 토스트에서는 없었던 에러가 갑자기 발생하는지 잘 모르겠습니다. 

에러 내용은 

The method makeText(Context, CharSequence, int) in the type Toast is not applicable for the arguments (new MenuItem.OnMenuItemClickListener(){}, String, int)

입니다.

대충 해석해보면 Toast.makteText()메서드를 온메뉴아이템리스너에서 적용시킬 수 없다고 하는데 그 이유를 모르겠네요 ㅠㅠ

그냥 일반 버튼에 onClickListener를 적용할때 똑같은 토스트를 적용했을 때는 잘 되었었는데 좀 당황스럽네요

가르쳐주시면 감사하겠습니다!!smiley

미스터펜 (180 포인트) 님이 2013년 2월 22일 질문

1개의 답변

+1 추천
 
채택된 답변
maketext의 인자 중 this 가 context가 아닌 itemclicklistener를 가리키고 있어서 그런겁니다.

this 대신 ActionBarMechanics.this를 이용해보세요
안티푸라면 (6,700 포인트) 님이 2013년 2월 22일 답변
미스터펜님이 2013년 2월 22일 채택됨
해결했습니다! 감사합니다!!^^
Context에 대해 계속 헷갈려서 그런데, 한가지만 더 여쭐게요~
ActionBarMechnics.this라고 고친다면, 여기서 this가 가리키고 있는 컨텍스트가 어떤건지 알수 있을 까요?
또, onOptionsItemSelected()메서드 안에서 사용된 this의 경우는 어떤컨텍스트를 가리키고 있나요?
정말 기본적인 건데 귀찮게 죄송합니다.^^;;
...