这是(我的)以下问题的扩展:
除此之外,当我点击TextLabel时,我收到以下运行时错误/崩溃:
java.lang.IllegalStateException: Could not find a method onClick(View) in the activity class org.radio.app.Contacts for onClick handler on view class android.widget.TextView with id 'contactLabel'
我以为是因为我在不同的文件中使用了自定义的OnClickListener实现。我尝试将它放在我的活动文件中,但是我得到了同样的错误。
我的TextView的XML有以下内容:
<TextView
android:id="@+id/contactLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Label"
android:textColor="@color/orange_theme_text"
android:textStyle="bold"
android:textSize="18sp"
android:paddingRight="7dp"
android:clickable="true"
android:onClick="onClick"/>
有关如何解决此问题的任何想法?
编辑:这是我的自定义OnClickListener,它甚至定义了OnClick:
private class ContactOCL extends Activity implements OnClickListener {
String contactInfo;
public ContactOCL(String contactInfo) {
this.contactInfo = contactInfo;
}
public void onClick(View v) {
Log.v("onClick", "Are we even getting here?");
// Check if contactInfo is an email address or a phone number
if (contactInfo.contains("@"))
{
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse("mailto:" + contactInfo);
intent.setData(data);
startActivity(intent);
}
// Otherwise we have a phone number
else
{
try {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" + contactInfo));
v.getContext().startActivity(callIntent);
} catch (ActivityNotFoundException activityException) {
Log.e("Calling a Phone Number", "Call failed", activityException);
}
}
}
}
再次编辑:以下是我的活动片段:
TextLabel = (TextView) viewCI.findViewById(R.id.contactLabel);
TextLabel.setOnClickListener(new ContactOCL(info[i]));
答案 0 :(得分:0)
您是否在代码中声明了以下内容
public void onClick(View v){
// ur code
}
编辑:
当您在布局xml中编写android:onClick时,您无需实现onClickListener。如果您想实现自定义onClickListener,请执行以下操作
删除
android:onClick="onClick"
在代码中添加以下行。
TextView tv = (TextView) findViewById(R.id.contactLabel);
tv.setOnClickListener(this);
答案 1 :(得分:0)
你需要拿出
android:onClick="onClick"
从你的xml 。它正在寻找您的Activity
但在您的自定义onClickListener
课程中不存在的此方法。如果您删除该行,那么它应该适合您,或者至少修复该错误
尝试更改此
TextLabel.setOnClickListener(new ContactOCL(info[i]));
到这个
TextLabel.setOnClickListener(new ContactOCL(info[i]), this); //this referring to `Activity` context
然后将您的onClick
类构造函数更改为接受context
修改强>
由于这是一个onClickListener
类,而不是从xml中调用,因此需要覆盖自定义类中的方法
@Override
public void onClick(View v)
{
...
}
另一个选项
很好但是我们缺少了一些东西,如果没有看到所有内容,很难说。但是,如果您只创建自定义侦听器类以访问从Activity
传递的变量,那么您实际上不需要该类。您已经拥有变量info[]
。确保将其声明为Activity
类的成员变量,然后您可以在xml中实现onClick
在xml中将其放回
<TextView
...
android:onClick="onClick"/>
然后在你的Activity
班级
public void onClick(View v)
{
// do your work here. You have access to the contact because it was initialized as a member variable
}
public class YourActivity extends Activity
{
DataType info[] = new DataType();
public void onCreate()
{
//set your contentView, button, etc here
}
答案 2 :(得分:0)
当你在xml中的TextView的android:onClick属性中定义了函数名时,你不必让你的Activity实现onClickListener。您可以执行xml定义或通过OnClickListener接口。
XML定义
定义时
<TextView
android:id="@+id/contactLabel"
....
....
android:onClick="onClick"/>
您说当单击TextView时,它应该在我的活动中查找名为“onClick”的函数,其中定义了TextView。因此,此处的函数名称可能是任何内容(不一定是onClick)。 您现在只需要确保活动中存在具有相同名称的功能。语法是:
public void <function name> (View v)
OnClickListener实施
让Activity处理单击TextView的另一种方法是以编程方式执行,而不是通过xml 当您的Activity实现OnClickListener并覆盖以下方法时,即可完成此操作:
@Override
public void onClick(View v)
请注意,在这种情况下,函数名称必须是onClick,并且函数应该是覆盖函数
为此,您必须告诉您Activity正在处理TextView的点击。你可以通过
来做到这一点 TextView textView = (TextView) findViewById(R.id.contactLabel);
textView.setOnClickListener(this);
最后,由于您正在执行这两个操作,并且函数的函数名称恰好与您的Activity实现的OnClickListener类中的现有函数相同,因此存在歧义,因此抛出异常。
答案 3 :(得分:0)
所以,如果这是一个listview,你需要为你的Adapter添加一个方法调用,让我们假设它是一个数组适配器,名为arrayAdapter
public View getView(int position, View convertView, ViewGroup parent) { //do some magic to create the new view View v = new View(....)// or assign convertView v.setOnClickListener(new OnClickListner....) }
答案 4 :(得分:0)
我最终取消了整个TextView点击,只为每个ListView项目执行onClick,这非常合适。它可能在将来引起问题,但它现在必须要做,我需要继续研究其他功能。 :/