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 来添加和减去文本视图而无需设置一百万个单独的 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++;
    }

在 while 循环外创建按钮 ClickListener 为:

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 函数内的代码在单击按钮时运行。它不记得循环的每次迭代期间变量的值,只是因为它在不同的范围内。

更新

以下代码仅使用一个 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 中有两个按钮(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 回答