2

「A」と「B」の 2 つのアクティビティがあるとします。

アクティビティ A のレイアウトにはボタンがあります。アクティビティ B でクリック リスナーの実装を設定したいので、ここでアクティビティ A を考えてみましょう。

Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(B.this);

アクティビティ B では、次の関数を実装しようとしています。

public void OnClick(View v)
{
//DO SOMETHING
}

次のエラーが表示されます。

View 型のメソッド setOnClickListener(View.OnClickListener) は、引数 (A) には適用されません。

  • タイプ A の外側のインスタンスはスコープ内でアクセスできません

ここで何が間違っていますか?

4

2 に答える 2

2

GUI コンポーネントの処理は、それをインスタンス化したのと同じ UI スレッド内で行う必要があります。

したがって、目的のビューは正しくありません。また、ビューがそのコンポーネントで設定されており、ユーザーが操作できるように現在表示されている (フォアグラウンドで) 場合にのみ、クリックと他のリスナーを機能させることができることを確認してください。

本当にそれが必要な場合は、次の方法で、さまざまなアクティビティ内のクリック リスナーのデフォルトの実装をオーバーライドできます。

1)静的参照: ボタンをアクティビティ A で public static として作成し、クラス A の名前でアクティビティ B で使用します。

2)インターフェース: アクティビティ A で OnClickListener を実装しますが、B ではアクセスできません

3)すべてのアクティビティのカスタム MyClickListener

public class MyClickListener implements OnClickListener {
    @Override
    public void onClick(View v) {
        mContext = v.getContext();

        switch (v.getId()) {
case R.id.button:
// Your click even code for all activities
break;
default:
break; }}
}

以下に示すように、クラス A と B の両方で使用します。button.setOnClickListener(new MyClickListener());

于 2012-09-17T18:19:34.947 に答える
1

OnClickListener のインスタンスを に渡す必要がありますbutton.setOnClickListener(..)。クラス A は OnClickListener を実装していないため、OnClickListener のインスタンスにするために実装する必要があります。

class A extends Activity implements OnClickListener {
    // instance variable, constructors, etc
    @Override
    public void onClick(View v) { // note onClick begins with lowercase
        // DO SOMETHING
    }
}
于 2012-09-17T18:13:21.563 に答える