繁体   English   中英

按下按钮更改TextView颜色

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM