无法找到自定义OnClickListener / OnClick的TextView

时间:2013-03-10 05:02:53

标签: android textview onclicklistener

这是(我的)以下问题的扩展:

除此之外,当我点击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]));

5 个答案:

答案 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中的T​​extView的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,这非常合适。它可能在将来引起问题,但它现在必须要做,我需要继续研究其他功能。 :/