2

私たちのアプリケーションには、( を拡張するImageView) カスタム ビューがあり、その中でタッチ イベントを処理してデータを記録します。このビューにコンテキスト メニュー機能を追加したいと考え、Android の公式ドキュメントのガイドラインに従いました。

コードはonTouchEventそれ自体で正常に動作します。コンテキスト メニュー コードも正常に動作します。ただし、両方を追加すると、コンテキスト メニュー コードが機能しなくなります。両方のコードを追加するonCreateContextMenuと、呼び出されないため、コンテキスト メニューが表示されないことがわかりました。

Android ドキュメントの私の解釈によると、falsefromを返すonTouchEventことは、イベントが消費されていないことを示しているため、それをさらに処理するために使用する必要があります。何らかの理由で、ここでは発生していません。誰かが私に欠けているものを教えていただければ幸いです。ところで、ターゲットは 2.3.4 ROM を実行している Nexus One です。

onTouchEventカスタム ビューのコードは次のとおりです。

public boolean onTouchEvent(MotionEvent event) 
{
    switch (event.getAction())
    {
        case  MotionEvent.ACTION_DOWN:
            // Add event coordinates to an arraylist
            break;
    }

    return false;
}

よろしくお願いします。

4

5 に答える 5

2

hackbodの回答を詳しく説明すると、おそらく最後のメソッドステートメントとして持つ必要がありますreturn super.onTouchEvent(event);

イベントを処理せず、デフォルトの View 動作を呼び出さないと、も何もせず、何も起こらないと思います。

戻り値のポイントは、たとえば、祖先のデフォルトの動作を呼び出し、祖先がイベントを処理したかどうかを派生クラスに知らせることです。

Android Developers でいくつかの検索を行った後、トピックを参照する、View の既存のコールバック メソッドをオーバーライドすると、 次のように表示されます。

これにより、カスタム ビュー内の各イベントのデフォルトの動作を定義し、イベントを他の子ビューに渡す必要があるかどうかを決定できます。

したがって、戻り値の背後にある主なアイデアは、イベントを子ビューに渡す必要があるかどうかを Android に知らせることです。

HTH

編集:

コメントで言及した「指示」に関して、一般的に言えば(つまり、Androidだけでなく)UIイベント処理プロセスは次のようになります。

ある時点で、派生したカスタム コントロールがイベントを受け取ります。イベント フックの実装で、祖先の動作を含めるかどうかはあなた次第です。クラスの継承方向についてはこれですべてです。

次に、もう一方の方向があります。これは、UI コントロールの階層に関連するものです。カスタム コントロールは 1 つの大きなコントロール コンテナーに含まれる場合があり、コントロールには他の内部コントロール (テキスト ボックス、ボタンなど) が含まれる場合もあります。この方向に関して、イベントを処理しないことを宣言すると (false を返す)、UI イベント処理メカニズムはバケットを含む(?) コントロールに渡します (あなたの背景にあるものを考えてください)。

于 2011-05-30T19:35:41.073 に答える
1

ロングクリックリスナーから、電話をかけることができます。

openContextMenu(View view)

http://developer.android.com/reference/android/app/Activity.html#openContextMenu(android.view.View

于 2011-05-30T17:36:24.623 に答える
0

false を返すと、イベントを消費しなかったことが親に伝えられます。View のデフォルトの実装は、そのビューのタッチ処理を実装します。それを実行したい場合は、super.onTouchEvent(event); を呼び出す必要があります。

于 2011-05-30T17:41:45.543 に答える