Android GridLayout获取行/列

7

我有一个包含按钮的3x3网格布局。这些按钮有一个onTileClicked()监听器。现在,我想要获取被点击的按钮在网格中的位置。以下是我的代码:

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

但是我如何获取所点击按钮的行和列?有一个 params.columnSpec,但我不知道该怎么处理它...

4个回答

5

没有直接获取单元格位置的方法。不过,在onItemClick监听器中,您可以计算出点击按钮的位置,假设您知道行数和列数:

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

2
感谢您的回答,AmmarCSE,但我通过以下方式解决了问题:
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);
}

4
AmmarCSE的方法更加清晰,使用您的代码应该使用switch语句。 - Marco Acierno

1
这可能有点老,但我也在寻找解决方案,但仍未找到。 我需要根据用户选择为游戏创建多行按钮。使用ID是不可能的,因为按钮数量可以从2x2变化到9x9。
我的按钮不需要标题,所以我做了以下操作:
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);

        }
    }

当然,如果您需要在按钮上显示文本,这种方法就不行了。也许您可以使用一个标签?

0

我也遇到了同样的问题,目前唯一让我感到舒适的解决方案是修改类并添加所需的任何信息。我的例子是

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

现在我们可以使用这个额外的功能。我们还可以重写setLayoutParams并将setPosInGrid()集成到其中。 除非您想要一个普通的ImageView,否则不需要修改其他代码,只需使用完整标识符“androi.widget.ImageView”即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接