2016-03-18 6 views
0

Ich habe ein XML-Layout, auf dem ich OnTouchListener, die Aufgabe ist Finger Streichen Richtung erkennen; Wie auch immer, es funktioniert nur, wenn der Wischvorgang nur auf dem Layout durchgeführt wird, aber nicht auf seinen Elementen (wie ImageViews, Buttons usw.). Wie schreibe ich es um, um das gesamte Layout zu bearbeiten, aber vermeide es, Dutzende von Listenern für alle Elemente zu erstellen?setOnTouchListener arbeitet nur für eine Ansicht

Layout:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:id="@+id/main_layout" 
       android:clickable="true" 
       android:focusable="true" 
       android:focusableInTouchMode="true" 
                > 
</RelativeLayout> 

Code:

View relative = findViewById(R.id.main_layout); 
relative.setOnTouchListener(...) 

Antwort

1

Weil Sie für nur eine Ansicht setzen OnClickListener die Eltern ist. deshalb gibt es nur eine Klick-Antwort. Sie können dies versuchen.

  Button button1 = (Button) findviewbyid(R.id.buttonid); 
      button.setOnTouchListener(...) 

Ähnliche Bilder oder andere Ansichten. Bearbeiten - Tun Sie dies für jede Ansicht, die Sie für wischen möchten.

ImageView im = (ImgaeView) findviewbyid(R.id.imageid) 
    im.setOnTouchListener(...) 

Ähnlich mit Every View für Listning Swipe.

EDIT- Sie wollen nicht mehr ONTouchListener machen. Machen Sie eine andere Klasse, die implementiert OnTouchListener

public class Mytouchlistener implements OnTouchlistener{ 
    @Override 
public boolean onTouch(View v, MotionEvent event) { 
    HERE PUT YOUR CODE. 
    } 

Dann

  Youanyview.OnTouchlistener(MyTouchlistener.class); 

auf die Idee kam ???

+0

Dies ist nur auf button1 arbeiten. – johnyX

+0

dann fügen Sie mehr hinzu, wie lassen Sie mich Ihnen zeigen. –

+0

Ja, ich weiß, aber genau das wollte ich vermeiden. Ich habe viele Elemente auf dem Layout und ich müsste das x mal erstellen. – johnyX

0

können Sie View.OnTouchListener implementieren, wie unten

public class SomeClass implements View.OnTouchListener { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch (v.getId()){ 
      case R.id.view1: 
       //do something 
       break; 
      case R.id.view2: 
       //do something here too 
       break; 
      default: 
       break; 
     } 
     return false; 
    } 

    } 

bewusst sein, gezeigt, dass Sie setOnTouchListener verwenden.

viel Glück.

0

können Sie folgenden Code verwenden, um eine perfekte Android-Geste zu machen:

Typ folgenden Code an Main_activity.java:

 
package com.androidtutorialpoint.myapplication; 


public class MainActivity extends AppCompatActivity implements 
            GestureDetector.OnGestureListener, 
            GestureDetector.OnDoubleTapListener { 

    private TextView output_text;    
    private GestureDetectorCompat DetectMe;  

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     output_text = (TextView) findViewById(R.id.outputText); // Taking reference of text to be displayed on screen 
     DetectMe = new GestureDetectorCompat(this,this); 
     DetectMe.setOnDoubleTapListener(this); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 
    } 

// Following functions are overrided to show text when a particular method called. 

    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) { 
     output_text.setText("onSingleTapConfirmed"); 
     return true; 
    } 

    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     output_text.setText("onDoubleTap"); 
     return true; 
    } 

    @Override 
    public boolean onDoubleTapEvent(MotionEvent e) { 
     output_text.setText("onDoubleTapEvent"); 
     return true; 
    } 

    @Override 
    public boolean onDown(MotionEvent e) { 
     output_text.setText("onDown"); 
     return true; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) { 
     output_text.setText("onShowPress"); 

    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     output_text.setText("onSingleTapUp"); 
     return true; 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     output_text.setText("onScroll"); 
     return true; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
     output_text.setText("onLongPress"); 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     output_text.setText("onFling"); 
     return true; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event){ 
     this.DetectMe.onTouchEvent(event); 
     return super.onTouchEvent(event); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 
Verwandte Themen