从以编程方式创建的OnClickListener获取源信息

时间:2011-04-05 00:23:30

标签: android

我正在编写一个Android应用程序,它以编程方式填充一个包含TextViews的几个视图的LinearLayout。另外,我正在为每个上面的视图添加OnClickListeners,以便我可以在单击时检索字符串包含的字符串。 ClickListeners正在运行,因为我在调试器运行时遇到了该方法,但我不确定如何访问正在调用它的特定视图的数据。这是clarfy的代码片段:

LinearLayout list = (LinearLayout)findViewById(R.id.whatever);

for(int i = 0; i < sourceArrayList.size(); i++)
{
    View customTextView = View.inflate(this, R.layout.custom_text_view.xml, null);
    TextView tv1 = (TextView)customTextView.findViewById(R.id.tv1);
    tv1.setText("This is the value I would like to retrieve");
    TextView tv2 = (TextView)customTextView.findViewById(R.id.tv2);    
    tv2.setText("I would also like to get this value");

    customTextView.setOnClickListener(new OnClickListener()
    {
        public void onClick(View arg0) 
        {
            Toast.makeText(getBaseContext(), "You clicked: x", Toast.LENGTH_SHORT).show();
        }

    });

    list.addView(customTextView);
}

因此,非常感谢有关如何在onClick()方法中获取这些textViews值的任何指导。

2 个答案:

答案 0 :(得分:1)

在匿名内部类中,您可以访问外部作用域中可用的最终变量。因此,为了能够在tv1中访问tv2OnClickListener,您只需要将其声明为最终版。

final TextView tv1 = (TextView)customTextView.findViewById(R.id.tv1);
tv1.setText("This is the value I would like to retrieve");
final TextView tv2 = (TextView)customTextView.findViewById(R.id.tv2);    
tv2.setText("I would also like to get this value");

customTextView.setOnClickListener(new OnClickListener()
{
    public void onClick(View arg0) 
    {
        Toast.makeText(getBaseContext(), "You clicked: " + tv1.getText(), Toast.LENGTH_SHORT).show();
    }

});

不确定您要完成的是什么,但您可能希望改为使用ListView

答案 1 :(得分:0)

如果我理解你所说的内容和你所包含的代码,听起来就像父视图内的任何点击(无论在哪里)都需要访问子视图的状态。是吗?

如果是这样,至少有两种基本方式(有多种变体)来做到这一点。

首先,如果要使用合理数量的视图,可以在外部类中设置一个变量来保存每个视图,并且可以将变量声明为final。然后你可以像Mayra概述的那样直接使用这些变量。

或者,onClick()方法的参数(在您的代码中,名为arg0)始终包含生成事件的视图。使用您的代码,这是父(customTextView)。您可以使用该视图来获取对任何子视图的引用,无论您是通过findViewById()执行此操作,还是以ViewHolder或其他任何方式执行此操作。例如,您可以将其设置为onClick():

public void onClick(View arg0) 
    {
        TextView textView1 = (TextView) arg0.findViewById(R.id.tv1);
        String text1 = textView1.getText().toString;
        Toast.makeText(getBaseContext(), text1, Toast.LENGTH_SHORT).show();
    }