[java] OnClickListener 내부에서 많은 항목에 액세스 할 수 없습니다. 어떻게 접근합니까?

OnClickListener 내부에서 다음과 같이 범위 “외부”에있는 대부분의 변수에 액세스 할 수 없습니다.

findViewById(R.id.Button01).setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent mainApps = new Intent(Intent.ACTION_MAIN);
                mainApps.addCategory(Intent.CATEGORY_LAUNCHER);
                List<ActivityInfo> activities = this.getPackageManager().queryIntentActivities(mainApps, 0);
                /*
                Intent intent = new Intent("com.sygic.drive/com.sygic/drive/.SygicDriveActivity");
                startActivity(intent);*/
            }

        });

이 예제에서는 PacketManager를 가져와야하는데 OnClickListener 내부에 Context를 사용할 수 없기 때문에 가져올 수 없습니다.

외부에서 정적 참조를 만들어 내부에서 사용할 수 있지만 그게 맞습니까? 항상 그렇게해야하는 게 이상해 보입니까?



답변

this코드 MyActivity.this에서 MyActivity가 Activity 하위 클래스의 클래스 이름 인 것으로 바꿉니다 .

설명 : 코드의이 부분을 사용할 때 익명 내부 클래스를 작성하고 있습니다. 익명 내부 클래스는 작성되는 클래스
new OnClickListener() {
의 인스턴스에 대한 참조를 가지고 있습니다. findViewById가 다음과 같기 때문에 활동 서브 클래스 내부에서 작성하는 것처럼 보입니다. 활동 방법. 활동은 컨텍스트이므로 자동으로 보유한 참조를 사용하기 만하면됩니다.


답변

클래스에서 OnClickListener 인터페이스를 구현하고 익명의 내부 클래스가 필요하지 않도록 할 수도 있습니다. 그런 다음 다음과 같이 클릭 리스너를 설정합니다.

findViewById(R.id.Button01).setOnClickListener(this);

하나의 리스너를 사용하는 여러 버튼이있는 경우 view.getId () (R.id의 뷰 ID에 해당)와 함께 switch 문을 사용하여 구분할 수 있습니다.


답변

할 수있는 몇 가지 작업이 있습니다. onClickListener를 구현하는 내부 클래스를 만들고 필요한 인수를 클래스 생성자에 전달할 수 있습니다. 나는 여전히 가장 깨끗한 접근 방식을 찾지 못했습니다. 나는 보통 내 행동을 수행하는 다른 방법을 만듭니다. 따라서 onClick (View v)에서 이와 같은 작업을 수행합니다.

onClick(View v){doMyAction(myParams)}

private void doMyAction(Object params){//do stuff}

그리고 리스너 메소드에서 리스너 외부의 메소드로 필요한 매개 변수를 전달하면됩니다.


답변

사용중인 Intent 생성자를 Intent (context, classname)로 변경하고 innerclass에서 getApplicationContext ()를 사용합니다. 어쨌든 내 문제를 해결했습니다.


답변