我是android编程的先驱。我想知道我可以在程序中自定义自定义布局的大小吗?
这是我正在尝试的解决方案: 1.我创建了一个名为MyLayout的自定义布局类,并将onMeasure和onScale方法编写为
MyLayout extends ViewGroup {
public double childWidth, childHeight;
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (getChildCount() > 0) {
//In the current version, we should only have one child view
View childView = getChildAt(0);
measureChild(childView, (int)(childWidth), (int)(childHeight));
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (getChildCount() > 0) {
View childView = getChildAt(0);
childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight());
}
}
}
创建此布局activity_mylayout的XML文件,在布局中我将imageview作为子布局
<com.example.MyLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/android" />
</com.example.MyLayout>
编写用于绘制视图的代码并设置其包含的子视图的大小
setContentView(R.layout.activity_mylayout);
MyLayout usl = (MyLayout)findViewById(R.layout.mylayout);
if(usl == null) System.out.println("SSSS");
usl.childWidth = 200;
usl.childHeight = 200;
现在我遇到了将MyLayout设为null并抛出空指针异常的问题。我想在很多地方我可能做错了,但是有关MyLayout为空的原因的任何建议?
答案 0 :(得分:0)
我想到的是,onMeasure必须在退出之前调用setMeasuredDimension(int,int),否则稍后调用measure将会失败。即使宽度和高度测量为0,您也需要这样做。
第二件事是 - 如果只有一个孩子,为什么这个观点一直存在?你所做的只是增加开销。根本没有设置这种布局可能是错误的设计,而不是直接使用子视图。
第三个是你可能会遇到导致空指针异常的usl等于null的情况,但是如果没有堆栈跟踪和xml被使用它是不可能的。