0

Android用の電卓を作ろうとしています。これが私のボタンのコードです:

int[] button_ids = {
    R.id.BtnNum0, R.id.BtnNum1, R.id.BtnNum2, R.id.BtnNum3, R.id.BtnNum4, R.id.BtnNum5, R.id.BtnNum6,
    R.id.BtnNum7, R.id.BtnNum8, R.id.BtnNum9, R.id.BtnAdd, R.id.BtnSub, R.id.BtnDiv, R.id.BtnMult,
    R.id.BtnClear, R.id.equals
};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    EditTextValue = (EditText) findViewById(R.id.editText1);
    TVValue = (TextView) findViewById(R.id.textView1);      
    buttons = new ArrayList<Button>();

    for(int id : button_ids) {
        Button button = (Button)findViewById(id);
        button.setOnClickListener(this);
        buttons.add(button);
    }   

}

この部分を、ボタンの ID を宣言する必要のないコード ブロックに変更するにはどうすればよいですか? (例R.id.BtnNum0)

int[] button_ids = {
    R.id.BtnNum0, R.id.BtnNum1, R.id.BtnNum2, R.id.BtnNum3, R.id.BtnNum4, R.id.BtnNum5, R.id.BtnNum6,
    R.id.BtnNum7, R.id.BtnNum8, R.id.BtnNum9, R.id.BtnAdd, R.id.BtnSub, R.id.BtnDiv, R.id.BtnMult,
    R.id.BtnClear, R.id.equals
};

答えを探していますが、まだ解決策が見つかりません。

4

4 に答える 4

1

このコードはOnClickListenerすべてButtonの s に対して 1 つのみを設定しているように見えるため、できることは xml で行うことです。

Buttonセットごとに

android:onClick="functionName"

次に、コードで と をすべて削除できid'sますfor loop。Javaでは、次のような関数を作成するだけです

public void functionName(View v)
{
    switch (v.getId())
    {
        case R.id.buttonId:
        // do work for this Button
         break;
       ...
}

あなたがやっている方法は問題ありませんが、これが私がこの状況を処理するのを好む方法です。xml で同じ関数名をすべて指定し、Buttonsその名前を Java で関数名として使用するだけです。voidまた、戻り値の型で関数を宣言しView、私の​​例のように唯一のパラメーターとして a を受け取るようにする必要があります。

Button Docs にもこの例があります

于 2013-07-23T13:49:23.787 に答える
1

レイアウトファイルで、これをすべてのボタンに追加します

 <Button
   ...
   android:onClick="btnClicked"
   .../>

次に、コードにこのメソッドを追加し、このメソッドの各ボタンを確認します

public void btnClicked(View v)
{
   switch(v.getId())
   {
      case R.id.BtnNum0:
      // your code
      break;
      ....
   }
}
于 2013-07-23T13:50:11.200 に答える
0

trevor-e が提案したように、注釈プロセッサを試すことができます。Android アノテーションを使用すると、コードを次のように簡素化できます。

@Click
public void BtnNum0() {
    // Button 0 clicked
}
@Click
public void BtnNum1() {
    // Button 1 clicked
}
// etc.

このルートを使用する場合は、ボタン名が関数名に対応しているため、Java 規則に従って名前を使用するようにしてください。

于 2013-07-23T13:52:27.293 に答える
0

残念ながら、ボイラープレートをあまり削減しないある種の注釈フレームワークを使用しない限り、これがおそらく最善の解決策です。

編集:

Button ビューを保持している ViewGroup へのポインターを取得してから、そのすべての子を取得し、それらを Buttons にキャストしながらループすることができます。

例: XML の Button オブジェクトが LinearLayout に格納されている場合、そのポインターを取得して、次のようにすることができます。

for(int i=0; i < ((ViewGroup)v).getChildCount(); ++i) {
    Button nextChild = (Button) ((ViewGroup)v).getChildAt(i);
}

もちろん、これには反対することをお勧めしますが、それでも可能性はあります。

于 2013-07-23T13:48:35.187 に答える