在Android中动态添加的文本视图上单击事件

在Android中动态添加的文本视图上单击事件,android,textview,onclicklistener,Android,Textview,Onclicklistener,我正在尝试添加20个文本视图,并为动态添加的文本视图分配一个onclick。问题是每当我尝试单击任何动态文本视图时。它总是触发上次添加的文本视图的单击事件 这是我的密码: EditText s; EditText t; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity

我正在尝试添加20个文本视图,并为动态添加的文本视图分配一个onclick。问题是每当我尝试单击任何动态文本视图时。它总是触发上次添加的文本视图的单击事件

这是我的密码:

EditText s;
EditText t;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RelativeLayout containerLayout = (RelativeLayout) findViewById(R.id.container);

    for (int i = 0; i < 20; i++) {
        TextView dynaText = new TextView(this);

        dynaText.setText("Some text " + i);
        dynaText.setTextSize(30);
        dynaText.setTag("" + i);

        dynaText.setOnClickListener(btnClickListener);
        // Set the location of your textView.

        dynaText.setPadding(0, (i * 30), 0, 0);

        containerLayout.addView(dynaText);
    }

}

OnClickListener btnClickListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        RelativeLayout ll = (RelativeLayout) v.getParent();
        TextView tv = (TextView) ll.getChildAt(2);
        // Integer pos = (Integer) tv.getTag();
        Toast.makeText(v.getContext(), "Toast " + v.getTag(),
                Toast.LENGTH_SHORT).show();
    }

};
edits;
编辑文本t;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout containerLayout=(RelativeLayout)findViewById(R.id.container);
对于(int i=0;i<20;i++){
TextView dynaText=新的TextView(此);
dynaText.setText(“某些文本”+i);
dynaText.setTextSize(30);
dynaText.setTag(“+i”);
setOnClickListener(btnclicklListener);
//设置文本视图的位置。
设置填充(0,(i*30),0,0);
containerLayout.addView(dynaText);
}
}
OnClickListener BTNClicklListener=新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
RelativeLayout ll=(RelativeLayout)v.getParent();
TextView电视=(TextView)ll.getChildAt(2);
//整数pos=(整数)tv.getTag();
Toast.makeText(v.getContext(),“Toast”+v.getTag(),
吐司。长度(短)。show();
}
};
}试试这个:

OnClickListener btnClickListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
          Toast.makeText(v.getContext(), "Toast " + v.getTag(),
                Toast.LENGTH_SHORT).show();
    }

};
更新:

单击最后一个
文本视图的原因是它太大了。。每个循环都会增加填充,当您单击某个位置时,它将始终命中最后一个
视图,因为它覆盖了其他视图。尝试
线性布局
并按如下方式移除填充:

public class MainActivity extends Activity implements OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LinearLayout containerLayout = (LinearLayout) findViewById(R.id.container);

        for (int i = 0; i < 20; i++) {
            TextView dynaText = new TextView(this);

            dynaText.setText("Some text " + i);
            dynaText.setTextSize(30);
            dynaText.setTag("" + i);
            dynaText.setOnClickListener(this);

            containerLayout.addView(dynaText);
        }
    }

    public void onClick(View v) {
        // do stuff
    }

}
public类MainActivity扩展活动实现OnClickListener{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout container布局=(LinearLayout)findViewById(R.id.container);
对于(int i=0;i<20;i++){
TextView dynaText=新的TextView(此);
dynaText.setText(“某些文本”+i);
dynaText.setTextSize(30);
dynaText.setTag(“+i”);
dynaText.setOnClickListener(this);
containerLayout.addView(dynaText);
}
}
公共void onClick(视图v){
//做事
}
}
但是你的问题解决了。。我认为
列表视图
适合您的目的:)

试试这个:

OnClickListener btnClickListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
          Toast.makeText(v.getContext(), "Toast " + v.getTag(),
                Toast.LENGTH_SHORT).show();
    }

};
更新:

单击最后一个
文本视图的原因是它太大了。。每个循环都会增加填充,当您单击某个位置时,它将始终命中最后一个
视图,因为它覆盖了其他视图。尝试
线性布局
并按如下方式移除填充:

public class MainActivity extends Activity implements OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LinearLayout containerLayout = (LinearLayout) findViewById(R.id.container);

        for (int i = 0; i < 20; i++) {
            TextView dynaText = new TextView(this);

            dynaText.setText("Some text " + i);
            dynaText.setTextSize(30);
            dynaText.setTag("" + i);
            dynaText.setOnClickListener(this);

            containerLayout.addView(dynaText);
        }
    }

    public void onClick(View v) {
        // do stuff
    }

}
public类MainActivity扩展活动实现OnClickListener{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout container布局=(LinearLayout)findViewById(R.id.container);
对于(int i=0;i<20;i++){
TextView dynaText=新的TextView(此);
dynaText.setText(“某些文本”+i);
dynaText.setTextSize(30);
dynaText.setTag(“+i”);
dynaText.setOnClickListener(this);
containerLayout.addView(dynaText);
}
}
公共void onClick(视图v){
//做事
}
}
但是你的问题解决了。。我认为
列表视图
符合您的目的:)

1)您应该首先使您的
文本视图
可点击:

for (int i = 0; i < 20; i++) {
        TextView dynaText = new TextView(this);

        dynaText.setText("Some text " + i);
        dynaText.setTextSize(30);
        dynaText.setTag("" + i);
        dynaText.setClickable(true);//make your TextView Clickable
        dynaText.setOnClickListener(btnClickListener);
        // Set the location of your textView.

        dynaText.setPadding(0, (i * 30), 0, 0);

        containerLayout.addView(dynaText);
    }
编辑:您正在一对一地添加
文本视图。这就是为什么单击事件会在最后添加的一个事件上激发。
尝试将
LinearLayout
android:orientation=“vertical”
一起使用,或者尝试将每个新文本视图添加到上一个文本视图下面:

for (int i = 0; i < 20; i++) {
        TextView dynaText = new TextView(this);

        dynaText.setText("Some text " + i);
        dynaText.setId(i+1);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        if(i!=0)
         params.addRule(RelativeLayout.BELOW, i);
         dynaText.setLayoutParams(params);
        dynaText.setTextSize(30);
        dynaText.setTag("" + i);

        dynaText.setOnClickListener(btnClickListener);

        containerLayout.addView(dynaText);
    }
for(int i=0;i<20;i++){
TextView dynaText=新的TextView(此);
dynaText.setText(“某些文本”+i);
dynaText.setId(i+1);
RelativeLayout.LayoutParams params=新的RelativeLayout.LayoutParams(LayoutParams.MATCH\u父级,LayoutParams.MATCH\u父级);
如果(i!=0)
参数addRule(RelativeLayout.down,i);
dynaText.setLayoutParams(params);
dynaText.setTextSize(30);
dynaText.setTag(“+i”);
setOnClickListener(btnclicklListener);
containerLayout.addView(dynaText);
}
1)您应该首先使您的
文本视图可点击

for (int i = 0; i < 20; i++) {
        TextView dynaText = new TextView(this);

        dynaText.setText("Some text " + i);
        dynaText.setTextSize(30);
        dynaText.setTag("" + i);
        dynaText.setClickable(true);//make your TextView Clickable
        dynaText.setOnClickListener(btnClickListener);
        // Set the location of your textView.

        dynaText.setPadding(0, (i * 30), 0, 0);

        containerLayout.addView(dynaText);
    }
编辑:您正在一对一地添加
文本视图。这就是为什么单击事件会在最后添加的一个事件上激发。
尝试将
LinearLayout
android:orientation=“vertical”
一起使用,或者尝试将每个新文本视图添加到上一个文本视图下面:

for (int i = 0; i < 20; i++) {
        TextView dynaText = new TextView(this);

        dynaText.setText("Some text " + i);
        dynaText.setId(i+1);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        if(i!=0)
         params.addRule(RelativeLayout.BELOW, i);
         dynaText.setLayoutParams(params);
        dynaText.setTextSize(30);
        dynaText.setTag("" + i);

        dynaText.setOnClickListener(btnClickListener);

        containerLayout.addView(dynaText);
    }
for(int i=0;i<20;i++){
TextView dynaText=新的TextView(此);
dynaText.setText(“某些文本”+i);
dynaText.setId(i+1);
RelativeLayout.LayoutParams params=新的RelativeLayout.LayoutParams(LayoutParams.MATCH\u父级,LayoutParams.MATCH\u父级);
如果(i!=0)
参数addRule(RelativeLayout.down,i);
dynaText.setLayoutParams(params);
dynaText.setTextSize(30);
dynaText.setTag(“+i”);
setOnClickListener(btnclicklListener);
containerLayout.addView(dynaText);
}

您可以尝试为
OnClickListener
使用匿名实例,并为每个视图创建不同的侦听器实例。大概是这样的:

dynaText.setPadding(0, (i * 30), 0, 0);
dynaText.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    ((TextView) v).getText();

}
});
containerLayout.addView(dynaText);

您可以尝试为
OnClickListener
使用匿名实例,并为每个视图创建不同的侦听器实例。大概是这样的:

dynaText.setPadding(0, (i * 30), 0, 0);
dynaText.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    ((TextView) v).getText();

}
});
containerLayout.addView(dynaText);

按以下方法进行操作,以获得