5

for ループでボタンを作成することができましたが、その中で変数を宣言しない理由がわかりませんでした。残念ながら、Eclipseは「bt」のみを識別し、[i]をループ内で表す番号に置き換えたくないため、レイアウトで正しいIDを見つけます。これを機能させる方法について何か考えはありますか?私はまた、うまくいかない私のような美しい他のソリューションにも最適です;)

Button [] bt = new Button[6];

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

    bt[0] = (Button) findViewById(R.id.bt0);
    bt[1] = (Button) findViewById(R.id.bt1);//This is what i'm trying to replace
    bt[2] = (Button) findViewById(R.id.bt2);
    bt[3] = (Button) findViewById(R.id.bt3);
    bt[4] = (Button) findViewById(R.id.bt4);
    bt[5] = (Button) findViewById(R.id.bt5);


    for (int i=0; i<6; i++) {
        final int b = i;
        bt [i] = (Button)findViewById(R.id.bt[i]);    <----//Whith this
        bt [i].setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent myIntent = new Intent(Start.this, MainActivity.class);
                myIntent.putExtra("players", b);
                startActivity(myIntent);

                //startActivity(new Intent(Start.this, MainActivity.class));
            }
        });

    }
}
4

2 に答える 2

11

私は次のことをします:

private static final int[] idArray = {R.id.bt0, R.id.bt1, R.id.bt2, R.id.bt3, R.id.bt4, R.id.bt5};

private Button[] bt = new Button[idArray.length];

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

    for (int i=0; i<idArray.length; i++) {
        final int b = i;
        bt [b] = (Button)findViewById(idArray[b]); // Fetch the view id from array
        bt [b].setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent myIntent = new Intent(Start.this, MainActivity.class);
                myIntent.putExtra("players", b);
                startActivity(myIntent);

                //startActivity(new Intent(Start.this, MainActivity.class));
            }
        });

    }
}

ボタンを追加または削除する場合は、ボタンを追加するだけで、idArray他のすべてのものはすでに動的です。

于 2012-12-19T09:35:26.873 に答える
0

同様のボタンのグループがあると思います-それらはすべてレイアウト上の1つの親内に配置されます(LinearLayoutまたはRelativeLayoutなど)。親を取得して、すべての子を取得できます。この方法では、各ボタンに id を指定する必要はありません。

ViewGroup buttonsView = (ViewGroup) findViewById(R.id.buttons);
List<Button> buttons = new ArrayList<Button>();
for (int i = 0; i < buttonsView.getChildCount(); i++) {
  buttons.add((Button) buttonsView.getChildAt(i));
}

final intまた、変数を作成する必要がないように、ボタンの番号をタグに保存することもできます。

ViewGroup buttonsView = (ViewGroup) findViewById(R.id.buttons);
List<Button> buttons = new ArrayList<Button>();
View.OnClickListener listener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent myIntent = new Intent(Start.this, MainActivity.class);
        myIntent.putExtra("players", (Integer) v.getTag());
        startActivity(myIntent);
        //startActivity(new Intent(Start.this, MainActivity.class));
    }
};
for (int i = 0; i < buttonsView.getChildCount(); i++) {
  Button button = (Button) buttonsView.getChildAt(i);
  button.setTag(i);
  button.setOnClickListener(listener);
  buttons.add(buttons);
}
于 2012-12-19T09:36:43.707 に答える