[英]Change TextView Color pressing a button
我正在尝试完全通过Java代码创建活动。 这里的目标是创建一个活动,该活动会被先前的活动填充。 这是商店清单活动。 用户在先前的活动中添加itens,并且当他要求显示完整列表时,将生成上述活动。
这里的问题是,我想将红色设置为带有itens名称的textview的初始颜色,然后当用户单击时,他们将其颜色更改为绿色。 但是,当我单击它时,应用程序将关闭,并显示消息indexoutofbounds异常。 有人可以帮我吗?
public class Listdinamiccor extends Activity {
Bundle recebendoparametros;
int i = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listdinamiccor);
Intent parametro = getIntent();
recebendoparametros = parametro.getExtras();
int j = recebendoparametros.getInt("i");
ScrollView sv = new ScrollView(this);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
sv.addView(ll);
final TextView[] tvarray = new TextView[j];
for (i = 0; i < tvarray.length; i++) {
String chave = "chave"+i;
final TextView tv = new TextView(this);
tvarray[i] = new TextView(this);
tvarray[i].setText(""+recebendoparametros.getString(chave));
tvarray[i].setTextColor(Color.RED);
tvarray[i].setOnClickListener(new View.OnClickListener() {
int click = 0;
@Override
public void onClick(View v) {
/*if (click == 0) {
tvarray[i].setTextColor(Color.GREEN);
}
else {
tvarray[i].setTextColor(Color.RED);
}*/
AlertDialog.Builder alert = new AlertDialog.Builder(Listdinamiccor.this);
alert.setTitle("dinamico");
alert.setMessage("eu sou muito dinamico");
}
});
ll.addView(tvarray[i]);
}
this.setContentView(sv);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.listdinamiccor, menu);
return true;
}
}
当您的循环完成执行后,我现在被设置为tvarray.length -您的onClick处理程序不会“记住” i的值,它只是按照您的指示进行操作,即在tvarray [i]上设置setTextColor,我现在已经超出范围了。
一种解决方法是在setOnClickListener行上方执行此操作:
final TextView me = tvarray[i];
然后将onClick方法更改为调用me.setTextColor而不是tvarray [i] .setTextColor。
另外,我不建议在循环外使用int i-我假设您已将成员移至父类,以便编译当前代码,但总的来说,您不想在外部使用循环索引for循环的代码(此异常是此类原因之一)。
尝试将View v转换为onclick侦听器内的TextView,而不是像在数组中那样使用创建的实例:
tvarray[i].setOnClickListener(new View.OnClickListener() {
int click = 0;
@Override
public void onClick(View v) {
if (click == 0) {
((TextView)v).setTextColor(Color.GREEN);
}
else {
((TextView)v).setTextColor(Color.RED);
}
AlertDialog.Builder alert = new AlertDialog.Builder(Listdinamiccor.this);
alert.setTitle("dinamico");
alert.setMessage("eu sou muito dinamico");
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.