2014-04-18 21 views
5

Tôi có nút GridLayout 3x3 có nút. Các nút này có trình nghe onTileClicked(). Bây giờ tôi muốn có được vị trí của các nút bấm trong lưới điện. Đây là mã của tôi:Android GridLayout nhận hàng/cột

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

Nhưng làm cách nào tôi có thể nhận hàng và cột của nút được nhấp? Có params.columnSpec nhưng tôi không biết phải làm gì với điều này ...

Trả lời

5

Không có cách nào trực tiếp để lấy vị trí của ô. Tuy nhiên, bạn có thể tính toán vị trí của các nút nhấp giả sử bạn biết số lượng các cột và hàng trong người nghe onItemClick:

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

Tôi không hiểu cách mục có thể có vị trí không phải là gridView ... – akari

2

Cám ơn AmmarCSE câu trả lời của bạn, nhưng tôi đã giải quyết được broblem bởi chỉ cần làm một cái gì đó như thế này:

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

cách AmmarCSE rõ ràng hơn nhiều và với mã của bạn, bạn nên sử dụng công tắc –

1

Điều này có thể cũ, nhưng tôi cũng đã tìm kiếm giải pháp và vẫn không tìm thấy giải pháp đó. Tôi cần tạo nhiều dòng nút tùy thuộc vào lựa chọn của người dùng cho trò chơi. Không thể sử dụng ID vì số lượng nút có thể thay đổi từ 2x2 đến 9x9.

nút của tôi không cần phải có một chú thích, vì vậy đây là những gì tôi đã làm:

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

     } 
    } 

Tất nhiên điều này sẽ không hoạt động nếu bạn cần một văn bản trên nút của bạn. Có lẽ bạn có thể sử dụng thẻ?

0

Tôi đang đối mặt với cùng một vấn đề và hiện tại giải pháp duy nhất giúp tôi thoải mái là sửa đổi lớp học và thêm bất kỳ thông tin nào bạn cần. Ví dụ của tôi là

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

Và bây giờ chúng tôi có thể sử dụng chức năng bổ sung này. Chúng ta cũng có thể viết lại setLayoutParams và tích hợp setPosInGrid() vào nó. Không cần sửa đổi các mã khác trừ khi bạn muốn một ImageView thông thường chỉ sử dụng số nhận dạng đầy đủ "androi.widget.ImageView".

Các vấn đề liên quan