2011-08-10 3 views
1

에 두 기능 안녕하세요이 코드를 가지고 :자바 코드 optimalization - 하나

this.firstBtn.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 

     final CharSequence[] items = {"1", "2", "3"}; 
     AlertDialog.Builder builder = new AlertDialog.Builder(SlovnikoidActivity.this); 
     builder.setTitle("test"); 
     builder.setItems(items, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int item) { 
       Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
       langFrom.setText(items[item]); 
      } 
     }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 
}); 

this.secondBtn.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 

      final CharSequence[] items = {"1", "2", "3"}; 
      AlertDialog.Builder builder = new AlertDialog.Builder(SlovnikoidActivity.this); 
      builder.setTitle("test"); 
      builder.setItems(items, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int item) { 
        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
        langFrom.setText(items[item]); 
       } 
      }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
     } 
    }); 

단지 두 개의 서로 다른 부분이 있습니다 : this.firstBtnthis.secondBtn 은 병합하는 방법을 방법이 있나요? 예를 들어 firstBtn을 클릭하면 foo(firstBtn)이라는 함수를 호출하고 secondBtn을 호출하면 foo(secondBtn)이 호출되고 나머지는 동일하게 작동합니까? 저는 자바와 안드로이드 개발을 처음 접했기 때문에 구문에 대해 잘 모르겠습니다.

감사합니다.

답변

3

원하는 것을 비교적 쉽게 할 수 있습니다. OnClickListener을 구현하는 새 클래스를 정의하고 두 클래스에서이 클래스의 새 인스턴스를 사용할 수 있습니다.

class MyOnClickListener implements OnClickListener { 
    public void onClick(View v) { 
     final CharSequence[] items = {"1", "2", "3"}; 
     AlertDialog.Builder builder = new AlertDialog.Builder(SlovnikoidActivity.this); 
     builder.setTitle("test"); 
     builder.setItems(items, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int item) { 
       Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
       langFrom.setText(items[item]); 
      } 
     }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 
} 

코드는 다음과 같이 할 수 있습니다 : 당신이 MyOnClickListener 년대 그냥 약간 다를 수해야하는 경우

this.firstBtn.setOnClickListener(new MyOnClickListener()); 
this.secondBtn.setOnClickListener(new MyOnClickListener()); 

은 분명히이 솔루션은 더 취할 수 있습니다. 이것은 당신이 변경 한 다음 onClick(...)에 호출에 사용되는 멤버 변수로 저장하고자하는 매개 변수를 사용하는 생성자 작성하여 수행 할 수 있습니다

class MyOnClickListener implements OnClickListener { 
    private CharSequence[] items; 

    public MyOnClickListener(CharSequence[] _items) { 
     items = _items; 
    } 

    public void onClick(View v) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(SlovnikoidActivity.this); 
     builder.setTitle("test"); 
     builder.setItems(items, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int item) { 
       Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
       langFrom.setText(items[item]); 
      } 
     }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 
} 

을 그리고 이것은 다음과 같이 사용할 수 있습니다 :

final CharSequence[] items1 = {"1", "2", "3"}; 
final CharSequence[] items2 = {"2", "3", "4"}; 
this.firstBtn.setOnClickListener(new MyOnClickListener(items1)); 
this.secondBtn.setOnClickListener(new MyOnClickListener(items2)); 

UPDATE

public class SlovnikoidActivity extends Activity { 
    //slovnikoidActivity definition 

    //inner class definition for MyOnClickListener 
    class MyOnClickListener implements OnClickListener { 
     private CharSequence[] items; 

     public MyOnClickListener(CharSequence[] _items) { 
      items = _items; 
     } 

     public void onClick(View v) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(SlovnikoidActivity.this); 
      builder.setTitle("test"); 
      builder.setItems(items, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int item) { 
        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); 
        langFrom.setText(items[item]); 
       } 
      }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
     } 
    } 
} 
+0

좋아 보인다. 나는 'extends SlovnikoidActivity'를 추가하여 하나의 오류를 수정했지만 네 번째 줄에는'슬로 보 유형의 엔 클로징 인스턴스가 범위에서 접근 가능하지 않습니다 '라는 메시지가 하나 더 있습니다. 나는 그게 무슨 뜻인지 모르겠다 고해서 그것을 고치는 법을 모른다. Thanks – simPod

+0

이 클래스 정의를 Activity 클래스의 하위 클래스로 만든다. (나는 이것을'SlovnikoidActivity'라고 부른다.) 그렇게하면 예외를 없앨 수 있습니다. –

+0

하위 클래스를 만드는 것은'extends SlovnikoidActivity'에 의해 만들어집니다. 맞습니까? 그것은 몇 가지 오류를 제거하는 데 도움이되지만 여전히'슬로 브 타입의 엔 클로징 인스턴스는 범위에서 접근 가능하지 않습니다. ' – simPod

1

nicholas.hauschild의 대답에 대한 대안으로, 별도의 클래스를 만들고 싶지 않으면 활동을 View.OnClickListener으로 구현하십시오.

그런 다음 onClick(View v) 메서드를 단추 코드가 이미있는 클래스로 옮깁니다. 다른 단추를 구별해야하는 경우 switch (v.getId())을 사용하십시오.

+0

+1 훌륭한 대안. 덕분에 –

+0

. 나는'public class SlovnikoidActivity extends Activity extends View.OnClickListener'를 작성했지만 'SlovnikoidActivity 유형은 반드시 상속 된 추상 메소드 View.OnClickListener.onClick (View)'을 구현해야합니다. 'View.OnClickListener.onClick (View)'로 변경하려고했으나 구문 오류가있어 해결할 수 없습니다. – simPod