Android GridLayout获取行/列

时间:2014-04-18 12:21:14

标签: java android layout listener grid-layout

我有一个带按钮的3x3 GridLayout。这些按钮有一个onTileClicked()侦听器。现在我想获得网格中点击按钮的位置。这是我的代码:

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

但是如何获得点击按钮的行和列?有params.columnSpec但我不知道如何处理这个......

4 个答案:

答案 0 :(得分:5)

没有直接的方法来获得细胞的位置。但是,如果您知道onItemClick侦听器中的列数和行数,则可以计算单击按钮的位置:

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

答案 1 :(得分: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);
}

答案 2 :(得分: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);

        }
    }

当然,如果您需要按钮上的文字,这将不起作用。也许你可以使用标签?

答案 3 :(得分: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”,否则不需要修改其他代码。