본문 바로가기
앱 만들기/안드로이드

안드로이드 클릭리스너를 구현하는 방법

by 나도 처음이야 2021. 10. 27.
반응형

 

스테이지 정보를 클릭시

게임 스테이지를 클릭 시 해당 스테이지 정보를 인텐트로 넘겨주어서 게임을 시작하게 한다.

이게 위 게임의 플로우이다. 그럼 클릭이벤트를 구현해야 된다. 하기처럼 말이다.

        View view = inflater.inflate(R.layout.fragment_stage, container, false);
        stage1 = view.findViewById(R.id.stage1);
        stage1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //stag1 시작하기
                Intent intent = new Intent(getActivity(), GameActivity.class);
                //스테이지 정보를 넘긴다.
                intent.putExtra("stageInfo", 1);
                startActivity(intent);
            }
        });

스테이지가 하나일 때는 위처럼 코드를 작성해도 되지만, 스테이지가 늘어난다면 각 스테이 별로 setOnClickListener 를 개별적으로 다 구현해주어야 한다. 중복된 코드의 양이 많아지는 비효율적인 일이되어 버린다. 

이런 경우 사용할수 있는 방법이 바로 리스너 클래스를 별도로 생성하는 방법이다.

해당 리스너 클래스는 일반적으로 이너클래스로 만들기도 하지만, 별도의 클래스로 빼서 Java 파일로 만들어도 상관없다.

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ClickListener ClickListener = new ClickListener();
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_stage, container, false);
        stage1 = view.findViewById(R.id.stage1);
        stage2 = view.findViewById(R.id.stage2);
        stage1.setOnClickListener(ClickListener);
        stage2.setOnClickListener(ClickListener);
              return view;
    }       
        
class ClickListener implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            //stag1 시작하기
            Intent intent = new Intent(getActivity(), GameActivity.class);
            //스테이지 정보를 넘긴다.
            switch(v.getId()) {
                case R.id.stage1:
                    intent.putExtra("stageInfo", 1);
                    break;
                case R.id.stage2:
                    intent.putExtra("stageInfo", 2);
                    break;
                default:
                    intent.putExtra("stageInfo", 1);
            }
            startActivity(intent);
        }        
     }
 }

위처럼 클릭 리스너를 처리하는 별도의 클래스를 구현하면,

버튼 인스턴스에서는 리스너 객체 등록하는 일만 하게 된다. 즉, 중복된 코드는 클래스에서 처리한다.

코드의 가독성이 좋아졌고, 디버깅시에도 훨씬 수월하다.

감사합니다.

반응형

댓글