1

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

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

5 回答 5

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);
于 2013-03-10T05:05:53.827 回答
0

我最终取消了整个 TextView 点击,只为每个 ListView 项目执行了一次 onClick,效果非常好。它可能会在未来引起问题,但现在必须这样做,我需要继续研究其他功能。:/

于 2013-03-10T22:15:59.117 回答
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类的成员变量,然后您可以onClick在 xml中实现

在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
}
于 2013-03-10T05:30:53.393 回答
0

当您在 xml 中 TextView 的 android:onClick 属性中定义了函数名称时,您不必让 Activity 实现 onClickListener。您可以执行 xml 定义或通过 OnClickListener 接口。

XML 定义

当你定义

     <TextView
            android:id="@+id/contactLabel"
            ....
            ....
            android:onClick="onClick"/>

您是说单击 TextView 时,它应该在我的定义 TextView 的活动中查找名为“onClick”的函数。因此,您的函数名称可能是 ANYTHING (不一定是 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 类中的现有函数相同,因此存在歧义,因此引发了异常。

于 2013-03-10T05:36:49.697 回答
0

所以,如果这是一个列表视图,您需要向适配器添加一个方法调用,让我们假设它是一个数组适配器,称为arrayAdapter

public View getView(int position, View convertView, ViewGroup parent)
{
  //做一些魔术来创建新视图

  View v = new View(....)//或赋值convertView

  v.setOnClickListener(新的 OnClickListner....)
}
于 2013-03-10T05:37:02.780 回答