在程序中更改自定义视图的大小?

时间:2014-12-06 23:00:56

标签: android android-layout

我是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());  
    }  
}  
} 
  1. 创建此布局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>  
    
  2. 编写用于绘制视图的代码并设置其包含的子视图的大小

    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;
    
  3. 现在我遇到了将MyLayout设为null并抛出空指针异常的问题。我想在很多地方我可能做错了,但是有关MyLayout为空的原因的任何建议?

1 个答案:

答案 0 :(得分:0)

我想到的是,onMeasure必须在退出之前调用setMeasuredDimension(int,int),否则稍后调用measure将会失败。即使宽度和高度测量为0,您也需要这样做。

第二件事是 - 如果只有一个孩子,为什么这个观点一直存在?你所做的只是增加开销。根本没有设置这种布局可能是错误的设计,而不是直接使用子视图。

第三个是你可能会遇到导致空指针异常的usl等于null的情况,但是如果没有堆栈跟踪和xml被使用它是不可能的。