getLayoutParams返回null?

tro*_*man 10 android

我创建了一个扩展View的类:

public class BoardView extends View  {
Run Code Online (Sandbox Code Playgroud)

我在应用程序的main.xml文件中指定了BoardView的宽度和高度:

  <mypackage.BoardView
        android:id="@+id/board"         
        android:layout_width="270px" 
        android:layout_height="270px" /> 
Run Code Online (Sandbox Code Playgroud)

我正在尝试从BoardView的构造函数调用的函数中获取宽度和高度.这是我正在做的事情:

ViewGroup.LayoutParams p = this.getLayoutParams();
int h = p.height;
Run Code Online (Sandbox Code Playgroud)

但是getLayoutParams总是返回null.知道为什么这不起作用吗?

Zso*_*any 16

将视图添加到其父级后,布局参数可用.尝试将代码从视图构造函数移动到onAttachedToWindow()因为getLayoutParams()不会返回null那里.

@Override
protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    assert getLayoutParams() != null;
}
Run Code Online (Sandbox Code Playgroud)


Sam*_*muh 13

我不确定在View的构造函数中是否可以使用布局参数(即LayoutParams的实例).我认为,它只有在"布局"通过后才可用.阅读Android如何在此处绘制视图.此外,此线程会尝试确定您应该准确获得视图的测量尺寸.

请注意,如果您只想获取通过布局XML传递的属性值,则可以将AttributeSet实例作为参数传递给构造函数.

public MyView(Context context, AttributeSet attrs){
// attrs.getAttributeCount();
// attrs.getAttributeXXXvalue();
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢您的帮助.我真正需要的只是我可以从构造函数中的AttributeSet获取的XML属性值.这是我的(丑陋)解决方案:String ns ="http://schemas.android.com/apk/res/android"; String v = attrs.getAttributeValue(ns,"layout_height"); //将"270px"转换为"270"v = v.replace("px",""); //在运行时,此值为"270.0"v = v.replace(".0",""); int h = Integer.parseInt(v); (2认同)