2013-12-06 3 views
4

Я положил много кнопок (16 * 16) в массив кнопок. Кнопка номер напрямую связан с изменениями, они должны сделать в другом массиве (например, button[12][7] устанавливает значение stat[12][7] 1)ANDROID onTouchListener on button array

Так что я подумал, что можно поставить на одну линии в onTouch методе, который реагирует на каждую кнопку. Пример (конечно, не работает)

public boolean onTouch(View arg0, MotionEvent arg1) { 
if (arg1.getAction() == MotionEvent.ACTION_DOWN) { 
if(arg0 == button[int a][int b]){stat[a][b]=1}; 

В этом псевдокоде, кнопка будет создать 2 int сек, описывающие 2 размеров массива, которые получают передаются в массив стата.

Если бы у кого-то было решение для этого, он спас меня несколько часов этой ночью.

Спасибо за ваши ответы.

ответ

2

Я думаю HasMap является лучшим решением

private HashMap<Integer,Button> btnMap = new HashMap<Integer, Button>(); 

private void init(){ 
    Button yourFirstBtn = (Button) findViewById(R.id.yourFirstBtn); 
    btnMap.put(yourFirstBtn.getId(), yourFirstBtn); 

    for(Button tempBtn: btnMap.values()){ 
     tempBtn.setOnClickListener(this); 
    } 
} 

@Override 
public void onClick(View v) { 
// TODO Auto-generated method stub 
    Button clickedBtn = btnMap.get(v.getId()); 
} 
+0

Большое спасибо, я уже сделал это сейчас, но, думаю, ваше очень умное решение! – user2875404

2

Вы добавляете onTouchListener в контейнер для кнопок?

Лучше всего добавить onTouchListener для каждой кнопки, а затем arg0 будет соответствовать конкретной кнопке.

Другим вариантом является использование GridView, в котором может использоваться setOnItemClickListener. http://developer.android.com/reference/android/widget/GridView.html

+0

Я добавляю onTouchListener к каждой из кнопок в огромной петле. Считается, что вид сетки будет иметь такое же количество работы. – user2875404

2

Попробуйте что-то вроде этого:

Button[][] myButtonMatrix = new Button[] { 
new Button[] { button11, button12, button13, button 14 }, 
new Button[] { button21, button22, button23, button24 } 
}; 

public class MatrixButtonListener implements View.OnClickListener { 
     private int x; 
     private int y; 

     public MatrixButtonListener(int x, int y) { 
      this.x = x; 
      this.y = y; 
     } 

     public int getX() { return x; } 
     public int getY() { return y; } 

     @Override 
     public void onClick(View v) { 
      stat[x][y] = x-y; // changes were made only in relation to x and y, nothing else 
      // for example: 
      if(x == 0) { 
       // button in first row 
       // do something 
      } 
     } 
    }; 

// to apply to each button in matrix: 

for(int i=0; i<myButtonMatrix.length; i++) { 
    for(int j=0; j<myButtonMatrix[i].length; j++) { 
     myButtonMatrix[i][j].setOnClickListener(new MatrixButtonListener(i,j)); 
    } 
} 

Что это должно делать:

Создать общий класс OnClickListener, который принимает й и у позиции в качестве параметра, так что каждый onClickListener имеет то же самое поведение, но differnet x и y позиции, в зависимости от самой кнопки.

Примечание: Это не проверено.

EDIT:

Другой способ пользовательского класса кнопки, которые вы используете, которая содержит X/Y координаты, а также. Просто добавьте onClickListener к каждой кнопке, отбросьте ее обратно к своему пользовательскому представлению и попросите x/y.

2

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

Например:

button[12][7].setTag("12|7"); 

Если кнопка были предварительно определены в XML, вы могли бы сделать то же самое с:

android:tag="12|7" 

Затем в сенсорную слушателя (я предполагаю, что тот же один прилагается ко всем кнопкам), получить метку с точки зрения, что затрагивалась:

String tag = (String) view.getTag(); 

Тогда подстроки, и у по двум индексам:

String indx1 = tag.substring(0, tag.indexOf("|")); 
String indx2 = tag.substring(tag.indexOf("|")+1); 
stat[Integer.parseInt(indx1)][Integer.parseInt(indx2)] = 1;