2011-08-10 7 views
1

に2つの関数こんにちは、私はこのコードを持っている:Javaコードoptimalization - 1

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(); 
     } 
    }); 

ちょうど2つの異なる部分があります:this.firstBtnthis.secondBtn はそれをマージする方法方法はありますか?たとえば、firstBtnをクリックすると、foo(firstBtn)secondBtnが呼び出され、foo(secondBtn)がコールされ、残りは同じになりますか? 今日私はJavaとAndroidの開発を初めて熟知しているので、構文などはわかりません。

ありがとうございました

答えて

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(); 
    } 
} 

あなたのコードは次のようになりますあなたの2 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'を追加することで1つのエラーを修正しましたが、' SlovnikoidActivityがスコープ内でアクセス可能であることを囲むインスタンスがありません 'というコードの4行目にもう1つはまだあります。私はそれが何を意味するのか分からないので、それを修正する方法を知らない。ありがとう – simPod

+0

このクラス定義をアクティビティクラスのサブクラス(これは 'SlovnikoidActivity'と呼ばれています)としましょう。あなたの例外を取り除くことができます。 –

+0

サブクラスを行うことは 'extends SlovnikoidActivity'によって行われます。それはいくつかのエラーを取り除くのに役立ちますが、まだエラーがあります。 'SlovnikoidActivityがスコープ内でアクセス可能な型の囲むインスタンスがありません。 ' – simPod

1

A 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