2

У меня есть gridview, который содержит некоторые предметы. Я хочу получить координаты экрана, касаясь любого элемента в сетке.Получение координат затронутого элемента внутри gridview

Я знаю, что могу это сделать, используя MotionEvent.getRawX и MotionEvent.getRawY. Проблема в том, что я не могу установить прослушиватель касания на элемент внутри сетки, он не срабатывает, я не знаю, почему. Я пытался установить слушателя для самого gridview, это работает, но как только я касаюсь любого элемента, callback вызывается более одного раза (2-4 раза). Вот мой код:

public class Calibration extends Activity { 

    List<String> list; 
    GridView grid; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.calibration_activity); 

     list = new ArrayList<String>(); 
     grid = (GridView) findViewById(R.id.gridView1); 


     list.add("1"); 
     list.add("2"); 
     list.add("3"); 
     list.add("4"); 
     list.add("5"); 
     list.add("6"); 
     list.add("7"); 
     list.add("8"); 
     list.add("9"); 

     ArrayAdapter<String> adp = new ArrayAdapter<String>(this, 
       android.R.layout.simple_dropdown_item_1line, list); 
     grid.setAdapter(adp); 




    /*Working but appears 2-4 times*/ 
     grid.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 

       Toast.makeText(getBaseContext(), "(" + motionEvent.getRawX() + ", " + motionEvent.getRawY() + ")", 
         Toast.LENGTH_LONG).show(); 
       return false; 
      } 
     }); 
    } 
} 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/gridView1" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:numColumns="auto_fit" 
      android:background="#7CFC00" 
      android:gravity="center" 
      android:columnWidth="100dp" 
      android:stretchMode="columnWidth" /> 

Обратите внимание, что моя цель состоит в том, чтобы иметь ImageView внутри не строковых значений gridView. Я попробовал, чтобы ImageView заполнил адаптер, а затем установил на него слушателя, но это не сработало. Итак, я просто использую значения String в качестве примера для этого вопроса.

Как я могу решить эту проблему?

ответ

1

Update ваш метод onTouch, чтобы показать тост только тогда, когда палец пользователя покинул GridView (ACTION_UP)

@Override 
public boolean onTouch(View view, MotionEvent motionEvent) { 
    if(motionEvent.getAction() == KeyEvent.ACTION_UP) { 
     Toast.makeText(getBaseContext(), "(" + motionEvent.getRawX() + ", " + motionEvent.getRawY() + ")", 
       Toast.LENGTH_LONG).show(); 
     return true; 
    } 
    else 
     return false; 
} 

Вы можете попытаться проверить другие условия, такие как KeyEvent ACTION_DOWN. Это до вас

Док HERE

ACTION_DOWN -> клавиша была нажата.

ACTION_MULTIPLE -> вы сдвинув через экран (это событие не отправляется, пока пользователь отключился экран)

ACTION_UP -> ключ был освобожден.

+0

Спасибо Гильерме П. за полезный ответ, мне нужно когда-нибудь попробовать решение. Я попробую и дам вам знать. Но, пожалуйста, скажите мне, почему вызов был вызван несколько раз? Это потому, что одновременно происходят несколько событий? Благодарю. – Dania

 Смежные вопросы

  • Нет связанных вопросов^_^