2013-04-01 15 views
8

Activity.onTouchEvent()メソッドでいくつかのB.logicを実行します。 TextViewなどのクリックできないビューでは問題なく動作しています。しかし、それはButtonをクリックして呼び出されることはありません。しかし私はそれも必要です。ボタンのクリック中にアクティビティのonTouchEvent()が呼び出されていない

ここにコードがあります。

public class MainActivity extends Activity { 
    private static final String TAG = MainActivity.class.getSimpleName(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     findViewById(R.id.button1).setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Toast.makeText(MainActivity.this, "Oh shit!! click performed... :(", Toast.LENGTH_LONG).show(); 

      } 
     }); 



    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     Log.d(TAG, "ssssssssssssssssssssssss:touch"); 
     return super.onTouchEvent(event); 
    } 

    public boolean dispatchTouchEvent(MotionEvent event) { 
     int eventaction=event.getAction(); 

     switch(eventaction) { 
     case MotionEvent.ACTION_MOVE: 
      break; 
     default: 
      break; 
     } 

     return super.dispatchTouchEvent(event); 
    } 

} 

ここから整理すると助けてください。

+2

を:

@Override public boolean onTouchEvent(MotionEvent event) { Log.d(TAG, "ssssssssssssssssssssssss:touch"); return super.onTouchEvent(event); }; 

はボタンに追加しますその下の意見のいずれかによって」。あなたのボタンはタッチイベントを消費/処理するため、アクティビティはコールを受信して​​いません。 TextViewはclickイベントを消費していません。あなたが目にしているのは期待される行動でしょう。 – greg7gkb

+0

Activity.dispatchTouchEvent()メソッドを処理して、以下のソリューションを追加しました。 – Noundla

答えて

14

私は、必要に応じてdispatchTouchEvent(MotionEvent ev)を使用しました。ここに解決策があります。

private boolean isInSideClicked = false; 
    public boolean dispatchTouchEvent(MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_DOWN) { 
      View content = findViewById(R.id.textView1); 
      int[] contentLocation = new int[2]; 
      content.getLocationOnScreen(contentLocation); 
      Rect rect = new Rect(contentLocation[0], 
           contentLocation[1], 
           contentLocation[0] + content.getWidth(), 
           contentLocation[1] + content.getHeight()); 

      View frame = findViewById(R.id.editText1); 
      int[] frameLocation = new int[2]; 
      frame.getLocationOnScreen(frameLocation); 
      Rect framerect = new Rect(frameLocation[0], 
        frameLocation[1], 
        frameLocation[0] + frame.getWidth(), 
        frameLocation[1] + frame.getHeight()); 
      Log.d(TAG, "rect: "+rect.bottom+" , "+rect.top+" , "+rect.left+" , "+rect.right); 
      Log.d(TAG, "FrameRect: "+framerect.bottom+" , "+framerect.top+" , "+framerect.left+" , "+framerect.right); 
      Log.d(TAG, "x: "+event.getX()+" y: "+event.getY()); 

      if((rect.contains((int)event.getX(), (int)event.getY()) || framerect.contains((int)event.getX(), (int)event.getY()))) { 
       isInSideClicked = true; 
      } 
      if(isInSideClicked){ 
       return super.dispatchTouchEvent(event); 
      }else{ 
       return true; 
      } 
     }else if(event.getAction() == MotionEvent.ACTION_UP && isInSideClicked) { 
      isInSideClicked = false; 
      return super.dispatchTouchEvent(event); 
     }else if(event.getAction() == MotionEvent.ACTION_MOVE && isInSideClicked) { 
      return super.dispatchTouchEvent(event); 
     }else{ 
      isInSideClicked = false; 
      return true;  
     } 
    } 

以下は、タッチイベントがOSレベルでどのように処理されるかに関する階層です。

これで、必要なレイアウト/ビューにないビューのタッチイベントを制限しました。

+0

非常に良い解決策 –

0
Please add below given 2 line in your xml hope it will help you its working fine for me. 

    **android:focusable="false" 
    android:focusableInTouchMode="false"** 


    <Button 
      android:id="@+id/button2" 
      android:layout_width="80dp" 
      android:layout_height="40dp" 
      android:layout_alignParentRight="true" 
      android:layout_below="@+id/button1" 
      android:layout_marginTop="3dp" 
      android:background="#FFFFFF" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:text="Delete" 
      android:textColor="#0099CC" /> 
0

あなたのonCreateメソッドで以下のコードを追加してください。

これで、ボタンのイベントを降りたり、移動したりすることができます。

ボタンアップイベントコール時にロジックを記述します。

findViewById(R.id.btn).setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       Toast.makeText(Main.this, 
         "Oh shit!! click down performed... :(", 
         Toast.LENGTH_LONG).show(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       break; 
      case MotionEvent.ACTION_UP: 
       Toast.makeText(Main.this, 
         "Oh shit!! click up performed... :(", 
         Toast.LENGTH_LONG).show(); 
       break; 
      default: 
       break; 
      } 
      return true; 
     } 
    }); 
1

ここでは、ボタンのtouchListenerを登録しています。ボタンのclickListenerだけが実装されています。ボタンのonTouchEvent()を呼び出すには、buttonを次のように登録する必要があります。button.setOnTouchListener(this);

0

私は同じ問題を抱えていました。それはあなたを削除せずに、解決することは非常に容易である:タッチスクリーンイベントが処理されなかったとき、Activity.onTouchEventは、()のみ」と呼ばれているドキュメント毎の

button.setOnTouchListener(new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     //YOUR CODE HERE 
     if(v==button){ 
      //Your button has been pressed 
     } 
     else { 
      //Other View element has been pressed 
      } 
    } 
} 
関連する問題