2011-08-10 44 views
1

你好,我有這樣的代碼:Java代碼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)和其餘的工作原理是什麼? 我不確定語法等,因爲我今天是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(); 
    } 
} 

您的代碼可以是這樣的:

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

顯然,這種解決方案可以進一步考慮,如果你的兩個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'來修正了一個錯誤,但是你的代碼的第四行還有一個錯誤,它說'沒有可以在範圍內訪問SlovnikoidActivity類型的封閉實例。我不知道如何解決它,因爲我不確定它是什麼意思。謝謝 – simPod

+0

使這個類定義成爲你的Activity類的一個子類(我認爲它被稱爲'SlovnikoidActivity')。這樣做會擺脫你的例外。 –

+0

做的子類是由'extends SlovnikoidActivity'做的,對吧?它有助於擺脫一些錯誤,但還是有這個錯誤'類型SlovnikoidActivity是scope' – simPod

1

甲作爲nicholas.hauschild的答案的替代方案,如果您不想單獨開課,只需讓您的活動實施View.OnClickListener即可。

然後,將您的onClick(View v)方法移至您的按鈕代碼所在的同一類。如果您需要區分不同的按鈕,請執行switch (v.getId())

+0

+1一個很好的選擇。 –

+0

謝謝。我寫了'公共類SlovnikoidActivity擴展活動實現View.OnClickListener',但有錯誤'類型SlovnikoidActivity必須實現繼承的抽象方法View.OnClickListener.onClick(View)'。我試圖將其更改爲「View.OnClickListener.onClick(View)」,但存在語法錯誤,無法解析 – simPod