1

我正在尝试完全通过 java 代码创建一个活动。这里的目标是创建一个由先前活动填充的活动。这是一个购物清单活动。用户在上一个活动中添加项目,当他要求显示完整列表时,将生成上述活动。

这里的问题是,我想将红色设置为带有 itens 名称的文本视图的初始颜色,当用户单击时,他们将颜色更改为绿色。但是,当我单击它时,应用程序会以消息 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;
}

}

4

2 回答 2

0

尝试将 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");

        }
    });
于 2013-10-15T01:41:56.217 回答
0

当您的循环完成执行时,i 现在设置为 tvarray.length - 您的 onClick 处理程序不会“记住” i 的值,它只是按照您告诉它的操作,即在 tvarray[i] 上设置文本颜色,我现在越界了。

解决它的一种方法是在 setOnClickListener 行上方执行此操作:

final TextView me = tvarray[i];

然后将您的 onClick 方法更改为调用 me.setTextColor 而不是 tvarray[i].setTextColor。

另外,我不建议在循环之外挂在 int i 上 - 我假设您将成员移动到父类以便编译您当前的代码,但通常您不想在外部使用 for 循环索引for 循环(这个例外就是这样的原因之一)。

于 2013-10-15T01:37:01.727 回答