2011-08-25 9 views
5

問題の説明:アンドロイド:: OnTouchListener && OnClickListener組み合わせの問題

私はRelativeLayoutTextViewを持っていると私は、ユーザーがそれに触れたとき、それは赤い色、そして彼はそれをクリックしたときに別のページに行きたいです。 OnTouchListenerは機能しない(理由はわかりません)ので、OnClickListenerをクリックし、タッチ機能(MotionEvent.ACTION_DOWN)を実装するOnTouchListenerを設定しようとしましたが、この組み合わせは機能しません。 (あなたがそれを押して解除し、彼の外に指をドラッグした場合のTextViewつもりをクリックすること)の人々は、我々はOnTouch MotionEvent.ACTION_UPOnClickを実装することができると言うが、これは私のTextViewレイアウトの外にトリガすることができますフォーラムで

これは望ましい動作ではありません:
TextViewでclick = press + releaseをクリックします。

誰かが私にこの解決策を教えてもらえますか?

答えて

3

アデルは、最初のクリックで問題になるのですか、まったくクリックしないのですか?

複数のクリック可能なレイアウトがあり、最初のクリックイベントが発生しない場合、この問題があります。これは、最初に選択された後、クリックイベントを取得するためです。下のコードを試してください。

private class CustomTouchListener implements OnTouchListener { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     TextView tv = (TextView) v.findViewById(R.id.single_line_text); 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      tv.setTextColor(COLOR_WHEN_PRESSED); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      tv.setTextColor(COLOR_WHEN_RELEASED); 
      // Action of click goes here 
     } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { 
      tv.setTextColor(COLOR_WHEN_RELEASED); 
          // To handle release outside the layout region 
     } 
     return false; 
    } 
} 

レイアウトにタッチリスナーを設定すると、これは現在の実装で機能しています。また、あなたのレイアウトに以下

android:focusable="true" 
android:focusableInTouchMode="true" 
android:clickable="true" 

を設定する必要が

はそれが役に立てば幸い!

EDIT:さらに、DOWNとUPの両方にフラグが必要です。 DOWNで設定し、UPで設定されているかどうかを確認します。これにより、ユーザーが画面上の任意の場所をタップしてから、テキストビューにカーソルを合わせてリリースするというバグが回避されます。

+0

多くの感謝!あなたは間違いなく私を助けました。私のためのトリックは、あなたが述べた3つのプロパティを設定することでした... – harsimranb

+0

助けてくれてありがとう!私はアンドロイド:focusable = "true"を私のTextViewに持っていた – Gatekeeper

21

action_upのときにView.performClick()を呼び出すことができます。それが役に立てば幸い。

your_txtView.setOnClickListener(new TextView.OnClickListener(){ 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    your_txtView.setOnTouchListener(new TextView.OnTouchListener(){ 
      @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (MotionEvent.ACTION_DOWN == event.getAction()) { 

     } else if (MotionEvent.ACTION_UP == event.getAction()) { 
      v.performClick(); 
     } 

     return true; 
    } 
    }); 
+0

私は同じ問題を抱えていました...そしてv.performClickはうまくいきました...これは解決策です...答えは –

+0

+1です。私は探していた。 – tokudu

+0

ありがとうございました。これは最高です。 – aNoviceGuy

2

同じ問題がありました。 ACTION_MOVEからfalseを返すことで解決しました。私は何時間もそれと戦っていて、さまざまなことを試してきましたが、私はこの小さな問題を見過ごしてしまったようです...そして、それは理にかなっています。 onTouchからtrueを返すと、さらに処理が停止されるため、OnClickListenerはポインタがビューの外に移動した後でもonClickをトリガーし、トリガーを認識しません。

+0

評判の欠如のためにコメントを追加できない@ bugs99に代わって: 'return true'を' return false'に変更すると、 'onTouchListener()'アクションを実行してからtouchイベントを'onClickListener()'これにより、 'performClick()'を明示的に実行する必要はありません。 – gturri

関連する問題