如何获取按钮的高度和宽度。

6

我创建了一个按钮数组。现在我想要找到按钮的高度和宽度,为此我使用了getWidth()getHeight()。但问题是它总是返回0。这是为什么?我发送了我的代码,请检查是否有任何错误。

LinearLayout layoutVertical = (LinearLayout) findViewById(R.id.liVLayout);
LinearLayout rowLayout = null;
LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1);

public static void main(String[] args)
{
    DBFacade dbFacade = new DBFacade();
    dbFacade.pick();
}

//Create Button
for(int i=0;i<6;i++)
{
rowLayout=new LinearLayout(this);
rowLayout.setWeightSum(7);
layoutVertical.addView(rowLayout,param);

for(int j=0;j<7;j++)
{
m_pBtnDay[i][j]=new Button(this);

rowLayout.addView(m_pBtnDay[i][j],param);

m_pBtnDay[i][j].setOnLongClickListener(this);

m_pBtnDay[i][j].setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);
m_pBtnDay[i][j].setTextSize(12);
}
}
x=m_pBtnDay[i][j].getWidth();
y=m_pBtnDay[i][j].getHeight();
Log.d("width",Integer.toString(x));
Log.d("Height",Integer.toString(y));
return true;
6个回答

13

很可能您过早地调用了 getWidth()getHeight():我认为 UI 尚未在屏幕上调整大小和布局...
您可以尝试将该代码放入此代码块内:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    // Call here getWidth() and getHeight()
 }

那么我应该在什么时候调用这些函数呢?我已经看了很多例子,但是找不到答案。你能帮我解决一下吗? - AndroidDev
@Anshuman:动态创建布局并在检查宽度和高度之前显示它。在我编辑的代码中,我提供了一个示例,但我相信这不是唯一的方法... - Marco
@Anshuman:你没有告诉我们你在哪个函数/事件中调用你的代码... - Marco
当我在onWindowFocusChanged(boolean hasFocus)中编写getWidth和getHeight的代码时,它会给我结果。不过,不同分辨率下的宽度和高度是不同的,这是真的吗? - AndroidDev
谢谢,这解决了问题。(调用方法过早)尝试在调用“Scene”的“show”之后设置“getWidth”。 - Don Larynx
啊哈,那就是答案!谢谢。 - driftwood

7
另一种方法
ViewTreeObserver vto = button.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {

        width = button.getWidth();
        height = button.getHeight();
    }
});

1
将此代码放入您的循环中。
x =  m_pBtnDay[i][j].getWidth();
y =  m_pBtnDay[i][j].getHeight();
Log.d("width", Integer.toString(x));
Log.d("Height", Integer.toString(y));

试一下


0
你试图在两个for循环之外使用计数变量"i"和"j"。这应该会引发异常,因为它们只在每个for块中可用。
尝试在第二个for循环中输出...
for (int i = 0; i<6; i++)
{
    ...
    for(int j=0; j<7; j++)
    {
        ....   
        x =  m_pBtnDay[i][j].getWidth();
        y =  m_pBtnDay[i][j].getHeight();
        Log.d("width", Integer.toString(x));
        Log.d("Height", Integer.toString(y));
    }
}

0
您可以覆盖以下视图方法,在布局阶段调用。
protected void onSizeChanged (int w, int h, int oldw, int oldh)

这似乎更合适,因为它明确说明了你观察到的零宽度和高度:

当此视图的大小发生更改时,在布局期间调用此方法。 如果您刚刚添加到视图层次结构中,则使用旧值调用。

参数 w:此视图的当前宽度。h:此视图的当前高度。oldw:此视图的旧宽度。oldh:此视图的旧高度。

请参见此处


-1

你也可以尝试这个:

btn.getDrawingCache().getHeight() and btn.getDrawingCache().getWidth()

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