2014-04-18 32 views
5

Ho un GridLayout 3x3 con pulsanti. Questi pulsanti hanno un listener onTileClicked(). Ora voglio ottenere la posizione del pulsante cliccato nella griglia. Ecco il mio codice:GridLayout Android ottiene riga/colonna

public void onTileClicked(View view) { 
    Button button = (Button) view; 
    GridLayout.LayoutParams params = (LayoutParams) button.getLayoutParams(); 
} 

Ma come posso ottenere la riga e la colonna del pulsante cliccato? C'è params.columnSpec ma non so cosa fare con questo ...

risposta

5

Non esiste un modo diretto per ottenere la posizione della cella. Tuttavia, è possibile calcolare la posizione del pulsante del supponendo che si conosce il numero di colonne e righe in chi ascolta onItemClick:

public void onItemClick(AdapterView parent, 
     View v, int position, long id) 
    { 
     int row_no=position/3; 
     int col_no=position%3; 
     . 
     . 
    } 
+1

Non capisco come l'oggetto possa avere una posizione non è un gridView ... – akari

2

Grazie per la risposta AmmarCSE, ma ho risolto il broblem da solo facendo qualcosa di simile a questo:

public void onTileClicked(View view) { 
    Button button = (Button) view; 
    if(button.getId()==R.id.btn00)onTileClicked(0, 0, button); 
    else if(button.getId()==R.id.btn01)onTileClicked(0, 1, button); 
    else if(button.getId()==R.id.btn02)onTileClicked(0, 2, button); 
    else if(button.getId()==R.id.btn10)onTileClicked(1, 0, button); 
    else if(button.getId()==R.id.btn11)onTileClicked(1, 1, button); 
    else if(button.getId()==R.id.btn12)onTileClicked(1, 2, button); 
    else if(button.getId()==R.id.btn20)onTileClicked(2, 0, button); 
    else if(button.getId()==R.id.btn21)onTileClicked(2, 1, button); 
    else if(button.getId()==R.id.btn22)onTileClicked(2, 2, button); 
} 
+1

il modo di AmmarCSE è molto più chiaro e con il tuo codice dovresti usare un interruttore –

1

Questo potrebbe essere vecchio, ma ho anche cercato una soluzione e ancora non l'ho trovato. Avevo bisogno di fare più linee di pulsante a seconda della scelta degli utenti per un gioco. L'uso di ID non è stato possibile perché il numero di pulsanti potrebbe variare da 2x2 a 9x9.

mio pulsante non ha bisogno di avere una didascalia, ecco quello che ho fatto:

layout = (GridLayout) findViewById(R.id.layoutPrincipal); 
    context = this;   
    for(int i=0;i<rowCount;i++){ 
     for(int j=0;j<columnCount;j++){ 
      Button mButon= new Button(this); 
      mButon.setText(""+i+""+j); 
      mButon.setTextColor(Color.TRANSPARENT); 

      mButon.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Button button = (Button) v; 


        //button.getText() allows me to retrieve the coordinates. 

        button.getText() 

       } 
      });  
      layout.addView(mButon); 

     } 
    } 

Naturalmente questo non funzionerà se avete bisogno di un testo sul vostro pulsante. Forse potresti usare un tag?

0

Sto affrontando lo stesso problema e attualmente l'unica soluzione che mi fa comodo è modificare la classe e aggiungere qualsiasi informazione necessaria. Il mio esempio è

class ImageView extends android.widget.ImageView { 
    public ImageView(Context context) { 
     super(context); 
    } 

    //the position of the plane head. 
    int xPos,yPos; 

    public void setPosInGrid(int x,int y) { 
     xPos=x;yPos=y; 
    } 

    public int[] getPosInGrid() { 
     int[] pos=new int[2]; 
     pos[0]=xPos; 
     pos[1]=yPos; 
     return pos; 
    } 
} 

E ora siamo in grado di utilizzare questa funzionalità aggiuntive. Possiamo anche riscrivere il setLayoutParams e integrare setPosInGrid() in esso. Nessuna modifica di altri codici è richiesta tranne quando si desidera un normale ImageView, basta utilizzare l'identificativo completo "androi.widget.ImageView".