【问题标题】:Seperate event listener for every textview in androidandroid中每个textview的单独事件监听器
【发布时间】:2010-10-10 14:40:22
【问题描述】:

我想将单独的事件侦听器添加到动态创建的 textview 列表中。到目前为止的代码是这样的:

while (cur.moveToNext()){
    TextView tv = new TextView(this);
    temp = cur.getString(cur.getColumnIndexOrThrow("_ID"));
    result = "some text";
    tv.setText(result);
    tv.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent myIntent = new Intent(v.getContext(), newsDetails.class);
                myIntent.putExtra("id", temp);
                startActivity(myIntent);
            }
        });
    lOut.addView(tv);
}

但这不起作用。单独的文本视图以列表的形式创建,但单独的事件侦听器不起作用。

【问题讨论】:

    标签: java android event-handling event-listener


    【解决方案1】:

    假设这是实际代码而不是伪代码,那么我同意 Aaron 的观点,即使用成员字段可能是您的问题的根源。但是,我不同意该解决方案:您不应该使用字段。 (如果你必须将你的字段命名为“temp”,这是一个很好的提示,它应该是一个本地变量。)如果你创建一个“final”局部变量,那么你知道它不会从你下面改变,并且该固定值将被锁定到您的匿名子类(即侦听器)中。

    代码变成如下:

    while (cur.moveToNext()){
        TextView tv = new TextView(this);
        final String temp = cur.getString(cur.getColumnIndexOrThrow("_ID"));
        final String result = "some text";
        tv.setText(result);
        tv.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    Intent myIntent = new Intent(v.getContext(), newsDetails.class);
                    myIntent.putExtra("id", temp);
                    startActivity(myIntent);
                }
            });
        lOut.addView(tv);
    }
    

    当然,您会想要去掉名为“temp”和“result”的字段,因为局部变量会取代它们。

    【讨论】:

    • 是的,这种方法肯定更好。这就是我在周日早上尝试回答技术问题时得到的结果:) 我的方法实际上可能会遇到与以前相同的问题,因为无论如何您都会存储指向同一个成员变量的指针。
    【解决方案2】:

    问题可能是您的temp 变量。我假设它是一个成员变量?事件监听器中的代码将使用temp 的值当事件被触发,而不是定义onClick() 函数时的值。

    在我的脑海中,我能想到的最简单的解决方案是将temp 对象存储为TextView 的标签,然后在onClick() 函数中检索它。

    while (cur.moveToNext()){
            TextView tv = new TextView(this);
            temp = cur.getString(cur.getColumnIndexOrThrow("_ID"));
            result = "some text";
            tv.setText(result);
            tv.setTag(temp);
            tv.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        Intent myIntent = new Intent(v.getContext(), newsDetails.class);
                        myIntent.putExtra("id", v.getTag());
                        startActivity(myIntent);
                    }
                });
            lOut.addView(tv);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      相关资源
      最近更新 更多