0

次のようなwhileループでonClickListnerを設定しようとしました。

    View inflaterLayout;
    LinearLayout myLayout = (LinearLayout)findViewById(R.id.linearLayout2);      
    while (counter < 5) {
        inflaterLayout = LayoutInflater.from(getBaseContext()).inflate(R.layout.newplayerlayout, null);
        myLayout.addView(inflaterLayout); 
        Button testButton = (Button) myLayout.findViewById(R.id.button2);
        testButton.setId(testButtonArray[counter]);
        ((TextView) myLayout.findViewById(R.id.textView1)).setId(testTextArray[counter]);
        testButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                ((TextView) findViewById(testTextArray[counter])).setText("Hi!");

            }
        });
        counter++;
    }

そして、私が思ったのは、testButtonのいずれかをクリックすると、その横にあるTextViewが変更されるということです。しかし、膨らんだ最初のボタンだけが機能します!誰かが私が間違っていることを知っていますか?

基本的に私が達成しようとしているのは、プラスボタン、マイナスボタン、テキストビューを備えたレイアウトを膨らませているので、テキストビューに追加および削除するonClickListenerを1つ設定できるようにしたいです。百万の別々のonClickListenersをセットアップするために!

4

4 に答える 4

2

これを試して:

 View inflaterLayout;
    LinearLayout myLayout = (LinearLayout)findViewById(R.id.linearLayout2);      
    while (counter < 5) {
        inflaterLayout = LayoutInflater.from(getBaseContext()).inflate(R.layout.newplayerlayout, null);
        myLayout.addView(inflaterLayout); 
        Button testButton = (Button) myLayout.findViewById(R.id.button2);
        testButton.setId(testButtonArray[counter]);
        ((TextView) myLayout.findViewById(R.id.textView1)).setId(testTextArray[counter]);

        testButton.setOnClickListener(btnhandler); // Click Listener here
        counter++;
    }

ボタン ClickListener を while ループの外側に作成します。

View.OnClickListener btnhandler = new View.OnClickListener() {
  public void onClick(View v) {

switch (v.getId()) {
  case testTextArray[0]:
    ((TextView) findViewById(testTextArray[0])).setText("Button One");
    break;
  case testTextArray[1]:
   ((TextView) findViewById(testTextArray[1])).setText("Button Two");
    break;
    .....
  }
  }
}
于 2012-05-28T04:29:53.697 に答える
1
new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ((TextView) findViewById(testTextArray[counter])).setText("Hi!");
    }

ボタンがクリックされると、onClick 関数内のコードが実行されます。スコープが異なるため、ループの各反復中に変数の値を覚えていません。

アップデート

次のコードでは、1 つの OnClickListener のみを使用して、対応する各 TextView の値をインクリメントまたはデクリメントします。見栄えの良いレイアウトで、これをレイアウト インフレータに簡単に適応させることができるはずです。

public class Example extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);

        OnClickListener listener = new OnClickListener() {
            public void onClick(View view) {
                TextView text = (TextView) view.getTag();

                if(((Button) view).getText().equals("+"))
                    text.setText(Integer.parseInt(text.getText().toString()) + 1 + "");
                else
                    text.setText(Integer.parseInt(text.getText().toString()) - 1 + "");
            }
        };

        for(int i = 0; i < 5; i++) {
            LinearLayout line = new LinearLayout(this);
            line.setOrientation(LinearLayout.HORIZONTAL);

            TextView text = new TextView(this);
            text.setText(i + "");
            line.addView(text);

            Button plus = new Button(this);
            plus.setTag(text);
            plus.setText("+");
            plus.setOnClickListener(listener);
            line.addView(plus);

            Button minus = new Button(this);
            minus.setTag(text);
            minus.setText("-");
            minus.setOnClickListener(listener);
            line.addView(minus);

            layout.addView(line);
        }

        setContentView(layout);
    }
}   

コメントからの追加

newplayerlayout.xml に 2 つのボタン (id が「plus」と「minus」) と TextView (id が「text」) があると仮定します。おそらく、次のようにスキームを実装します。

OnClickListener mListener = new OnClickListener() {
    public void onClick(View view) {
        TextView text = (TextView) view.getTag();

        if(((Button) view).getText().equals("+"))
            text.setText(Integer.parseInt(text.getText().toString()) + 1 + "");
        else
            text.setText(Integer.parseInt(text.getText().toString()) - 1 + "");
    }
};
...


while (counter < 5) {
    inflaterLayout = LayoutInflater.from(getBaseContext()).inflate(R.layout.newplayerlayout, null);
    myLayout.addView(inflaterLayout);

    TextView inflatedText = (TextView) inflaterLayout.findViewById(R.id.text);
    Button testButton = (Button) inflaterLayout.findViewById(R.id.plus);
    testButton.setTag(inflatedText);
    testButton.setText("+");
    testButton.setOnClickListener(mListener);

    testButton = (Button) inflaterLayout.findViewById(R.id.minus);
    testButton.setTag(inflatedText);
    testButton.setText("-");
    testButton.setOnClickListener(mListener);

    counter++;
}
于 2012-05-28T04:31:40.313 に答える
0

コード testButton.setOnClickListener() によって、ボタンがクリックされたときに onClick() メソッドを実行するクラスを登録します。したがって、新しい匿名クラスが while ループに登録されるたびに、ボタンをクリックすると、最後に登録されたクラスの onClick() メソッドが実行されます。

于 2012-05-28T04:33:19.853 に答える
0
View inflaterLayout;
LinearLayout myLayout = (LinearLayout)findViewById(R.id.linearLayout2);      
while (counter < 5) {
    inflaterLayout = LayoutInflater.from(getBaseContext()).inflate(R.layout.newplayerlayout, null);
    myLayout.addView(inflaterLayout); 
    Button testButton = (Button) myLayout.findViewById(R.id.button2);
    testButton.setId(testButtonArray[counter]);
    ((TextView) myLayout.findViewById(R.id.textView1)).setId(testTextArray[counter]);
    testButton.setOnClickListener(new View.OnClickListener() {
        int select = counter;
        @Override
        public void onClick(View v) {
            ((TextView) findViewById(testTextArray[select])).setText("Hi!");
        }
    });
    counter++;
}
于 2012-08-23T13:26:43.233 に答える