2016-03-18 2 views
0

У меня есть XML-макет, на котором я применяю OnTouchListener, задачей которого является определение направления пальца; во всяком случае, он работает только тогда, когда салфетки выполняются только по макету, но не по его элементам (например, ImageViews, Buttons и т. д.). Как переписать его, чтобы сделать салфетки работающими на весь макет, но не создавать десятки Listeners для всех элементов на нем?setOnTouchListener, работающий только для одного вида

Планировка:

<?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> 

Код:

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

ответ

1

Поскольку вы устанавливаете OnclickListener только один взгляд, который является родителем. поэтому есть ответ только на один клик. Вы можете попробовать это.

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

Аналогичным образом изображения или другой вид. Редактировать - Сделайте это для каждого представления, которое вы хотите перечислить.

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

Аналогично каждому виду для прокрутки.

EDIT- Так что вы не хотите делать больше ONTouchListener. Сделайте еще один класс, который реализует OnTouchListener

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

Тогда

  Youanyview.OnTouchlistener(MyTouchlistener.class); 

Есть идея ???

+0

Это работает только на Button1. – johnyX

+0

затем добавьте больше, как я покажу вам. –

+0

Да, я знаю, но это именно то, чего я хотел избежать. У меня много элементов в макете, и мне нужно будет создать это x раз. – johnyX

0

можно реализовать View.OnTouchListener, как показано ниже

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; 
    } 

    } 

быть в курсе, что вы должны использовать setOnTouchListener.

удачи.

0

Вы можете использовать следующий код, чтобы сделать идеальный андроид жест:

Тип следующий код 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); 
    } 
} 
Смежные вопросы