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

結局、TextViewクリック全体を破棄し、ListViewアイテムごとにonClickを実行するだけで、これは完全に正常に機能します。将来的に問題が発生する可能性がありますが、今のところ問題が発生する可能性があり、他の機能の作業に移る必要があります。:/

于 2013-03-10T22:15:59.117 に答える
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

取り出す必要があります

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」という名前の関数を探す必要があると言っています。このため、ここでの関数の名前は何でもかまいません(必ずしもonClickである必要はありません)。ここで、同じ名前の関数がアクティビティに含まれていることを確認する必要があります。構文は次のとおりです。

    public void <function name> (View v)

OnClickListenerの実装

アクティビティでTextViewのクリックを処理する別の方法は、xmlではなくプログラムで実行することです。これは、アクティビティがOnClickListenerを実装し、次のメソッドをオーバーライドするときに実行されます。

    @Override
    public void onClick(View v)

この場合、関数名はonClickである必要があり、関数はオーバーライド関数である必要があることに注意してください

このために、アクティビティが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)
{{
  //魔法を使って新しいビューを作成します

  ビューv=新しいビュー(....)//またはconvertViewを割り当てます

  v.setOnClickListener(new OnClickListner ....)
}
于 2013-03-10T05:37:02.780 に答える