此代码位于on click侦听器下,也位于on create方法下,时间点击textView或加载它停止运行的页面并写入不幸的是,appName已停止。
for (int i = 0 ; i < MAX_BUTTONS; i++){
Button button = (Button) getLayoutInflater().inflate(R.layout.button_layout,buttonsContainer,false);
button.setText("Test" + i);
button.setOnClickListener((View.OnClickListener) this);
buttonsContainer.addView(button);
if (i != MAX_BUTTONS - i){
buttonsContainer.addView(new Space(this),new ViewGroup.MarginLayoutParams(buttonsSpacing,buttonSize));
}
}
答案 0 :(得分:0)
我认为这是因为你在setOnClickListener中的强制转换。只需使用“this”作为参数,如果您的类实现了侦听器,则不需要强制转换。另请注意,您通过在循环中调用getLayoutInflater来创建不必要的对象垃圾。您需要做的就是在循环外调用一次,并使用它的引用。这样,您只需创建一个n +对象,而不是创建n +对象。最后我看到你正在打电话
if(i != MAX_BUTTONS - i)
不是你的意思
if(i != MAX_BUTTONS - 1)
答案 1 :(得分:0)
看起来您可能需要在循环的每次迭代中创建一个新的Button对象,而不是给布局充气,例如
for (int i = 0 ; i < MAX_BUTTONS; i++){
Button button = new Button(this);
button.setText("Test" + i);
button.setOnClickListener((View.OnClickListener) this);
buttonsContainer.addView(button);
if (i != MAX_BUTTONS - i){
buttonsContainer.addView(new Space(this),new ViewGroup.MarginLayoutParams(buttonsSpacing,buttonSize));
}
}
由于您是以编程方式创建Button,因此您可能需要检查this答案以创建LayoutParams。
编辑:我想提及我同意Bryan Mill关于你的回答如果你的Activity实现了View.OnClickListener,你可以通过传递上下文来构造你的监听器,例如button.setOnClickListener(this),以及你或许打算写if(i!= MAX_BUTTONS - 1)而不是-i。