2017-06-05 11 views
0

私のカスタムビューにアイテムを動的に追加しようとしていて、一緒に追加されたすべての子のサイズの最終高さにします。唯一の問題は、child.getMeasuredHeightまたはchild.getMeasuredWidthは実行時に常に値0を返します。私がデバッグしているとき、ランダムに10回のうち1回は、私が実際に期待していたデータが実際には192の値であるようです。私が間違っていることがありますか?getMeasuredWidthまたはHeightにonMeasureを呼び出すと、子の場合は0が返されます。

xmlファイル

<CustomLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_marginTop="80dp" 
    android:orientation="vertical" 
    android:layout_width="200dp" 
    android:layout_height="100dp" 
    android:id="@+id/custom_layout" 
    android:background="@drawable/custom_shape"/> 
</CustomLayout> 

ここでは、それぞれの子に依頼する必要があります。私の主な活動

Button b = new Button(this); 
     b.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
     b.setText("Sample Test"); 
     b.setTextSize(14); 
     mCustomView.addView(b); 

答えて

0

の部分では私のCustomLayout.javaクラス

public class CustomLayout extends LinearLayout { 

public CustomLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CustomLayout(Context context) { 
    super(context); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int count = getChildCount(); 

    int maxHeight = 0; 
    int maxWidth = 0; 

    int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
    int heightSize = MeasureSpec.getSize(heightMeasureSpec); 
    for(int i=0; i <count; i++) { 
     final View child = getChildAt(i); 
     if(child.getVisibility() != GONE) { 

      maxHeight += child.getMeasuredHeight(); 

     } 
    } 

    setMeasuredDimension(widthSize,maxHeight); 
} 

の一部ですViewGroupの寸法にアクセスする前に測定することができます。これは[measureChild](https://developer.android.coma/reference/android/view/ViewGroup.html#measureChild(android.view.View、int、int))または[measureChildWithMarginshttps://developer.android.coma/reference/android/view/ViewGroup.html#measureChild(android.view.View、int、int))の呼び出しで行われます。

ViewGroupのデベロッパーガイドを参照して、子供の測定方法を確認してください。

// Iterate through all children, measuring them and computing our dimensions 
// from their size. 
for (int i = 0; i < count; i++) { 
    final View child = getChildAt(i); 
    if (child.getVisibility() != GONE) { 
     // Measure the child. 
     measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0); 

     // Update our size information based on the layout params. Children 
     // that asked to be positioned on the left or right go in those gutters. 
     final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 
     if (lp.position == LayoutParams.POSITION_LEFT) { 
      mLeftWidth += Math.max(maxWidth, 
        child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); 
     } else if (lp.position == LayoutParams.POSITION_RIGHT) { 
      mRightWidth += Math.max(maxWidth, 
        child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); 
     } else { 
      maxWidth = Math.max(maxWidth, 
        child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin); 
     } 
     maxHeight = Math.max(maxHeight, 
       child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin); 
     childState = combineMeasuredStates(childState, child.getMeasuredState()); 
    } 
} 
関連する問題