我正在编写一个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值的任何指导。
答案 0 :(得分:1)
在匿名内部类中,您可以访问外部作用域中可用的最终变量。因此,为了能够在tv1
中访问tv2
或OnClickListener
,您只需要将其声明为最终版。
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();
}