Java 如何调用onMeasure方法安卓

Java 如何调用onMeasure方法安卓,java,android,onmeasure,Java,Android,Onmeasure,我有一个活动和一个视图。此视图的目的是显示方形栅格。正方形边将等于屏幕宽度除以水平存在的正方形数 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getValues(); createLayout(); } public static int top; public static int side; private vo

我有一个活动和一个视图。此视图的目的是显示方形栅格。正方形边将等于屏幕宽度除以水平存在的正方形数

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getValues();
    createLayout();
}

public static int top;
public static int side;

private void getValues() {
    top = 5; //squares horizontally
    side = 6; //squares vertically
}

private void createLayout() {
    BoardView bv = new BoardView(this);
    bv.setBackgroundColor(Color.BLUE);
    setContentView(bv);
    bv.createGuideLines();
}
我已经努力创建具有自定义高度的视图,我做到了:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    squareSide = MeasureSpec.getSize(widthMeasureSpec)/top;
    setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),squareSide*side);
}

public void createGuideLines() {
    for(int c = 1; c<=side; ++c) {
        path.moveTo(c*squareSide, 0);
        path.lineTo(c*squareSide, squareSide*top);
    }
    for(int l = 1; l<=side; ++l) {
        path.moveTo(0, l*squareSide);
        path.lineTo(side*squareSide, l*squareSide);
    }
    invalidate();
}
问题是,当我调试时,squareSide变量的值为0。我认为可能是在createGuideLines之后调用了onMeasure。如果我以前打过电话,它能解决我的问题吗?我在文档中读到有一个方法requestLayout调用onMeasure方法,但我不知道如何实现它

谢谢您的时间。

将requestLayout调用添加到createLayout方法中

invalidate将导致视图及其相交的视图通过调用各自的onDraw等方式重新绘制

另一方面,requestLayout将使视图自行调整大小。这两个过程相互独立;requestLayout不会调用invalidate,反之亦然


在您的情况下,您可以调用requestLayout,因为您只处理测量值。

我建议您使用onCreate方法执行此操作:

Display display = getWindowManager().getDefaultDisplay();
int squareSide = (int) Math.floor(display.getWidth() / top);

谢谢你的解释,艾曼纽。我实现了requestLayout,就像@petey说的,问题是,我仍然得到squareSize=0。注意:我添加了一个断点,用于在方法onMeasure上进行调试,而调试器没有进入该断点。好吧,它可以工作,但我更喜欢使用不推荐的方法:b,解决方案:Display Display=getWindowManager.getDefaultDisplay;点p=新点;display.getSizep;方形侧=p.x/顶部;
Display display = getWindowManager().getDefaultDisplay();
int squareSide = (int) Math.floor(display.getWidth() / top);