2017-07-14 88 views
0

我构建自定义视图扩展LinearLayout和简单3儿童(2 TextView和ImageView)。我在代码中动态创建这个视图并将其添加到父LinearLayout。这个视图有背景,所以我可以很容易地在屏幕上看到它在它的位置正确膨胀,但是任何一个孩子都不可见。我检查LayoutInspector它表明,一切都正确设置好的(文本值TextViews和图片ImageView的),但不知何故,当我试图找到他们在检查它们显示为小点了我的customView:自定义LinearLayout - 孩子不可见

enter image description here

我的CustomView被称为DayTileView,这是灰色背景的正方形。正如你在左边的检查员看到的,孩子们充满了内容。查看的布局:

<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <merge> 
     <TextView 
       android:id="@+id/day" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       android:textColor="@android:color/white" 
     /> 

    <TextView 
      android:id="@+id/dayName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:textColor="@android:color/white" 
    /> 

    <ImageView 
      android:id="@+id/padlock" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:src="@drawable/ic_padlock" 
    /> 
</merge> 
</layout> 

而其代码:

public class DayTileView extends LinearLayout { 
private DayTileBinding mBinding; 

public DayTileView(Context context) { 
    super(context); 
    init(); 
} 

public DayTileView(Context context, @Nullable AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

public DayTileView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    init(); 
} 

private void init() { 
    mBinding = DataBindingUtil.inflate(LayoutInflater.from(getContext()), R.layout.day_tile, this, true); 
    setOrientation(VERTICAL); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    final int width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); 
    setMeasuredDimension(width, width); 
} 

public void setDay(int day, int month, int year) { 
    DateTime settedDay = new DateTime().withYear(year).withMonthOfYear(month).withDayOfMonth(day); 
    mBinding.day.setText(String.valueOf(day)); 
    String dayName = settedDay.dayOfWeek().getAsText(); 
    mBinding.dayName.setText(dayName); 
    boolean isWeekend = settedDay.dayOfWeek().get() == 6 || settedDay.dayOfWeek().get() == 7; 
    setBackgroundColor(ContextCompat.getColor(getContext(), isWeekend ? R.color.weekend_bg : R.color.weekday_bg)); 
} 

}

它在另一个CustomView这也是使用的LinearLayout,但室内用水平方向(PlannedDayView上检查员):

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <merge> 

     <*.customViews.DayTileView 
       android:id="@+id/dayTile" 
       android:layout_width="0dp" 
       android:layout_weight="0.2" 
       android:layout_height="wrap_content"/> 

     <LinearLayout 
       android:id="@+id/container" 
       android:orientation="vertical" 
       android:layout_weight="1.2" 
       android:layout_width="0dp" 
       android:layout_height="wrap_content"/> 

    </merge> 
</layout> 

有没有人有任何想法什么可能会造成这种情况(孩子的视线)?当我将LinearLayout的合并替换为垂直方向和相同背景时,布局的设计模式中的所有内容都可以正确显示,因此它应该可以正常工作。

编辑: 我发现,如果我在查看initalization Padding Top期间设置为10px,则点正在向下移动。所以它看起来像Android没有正确膨胀TextViews和ImageView

+0

尝试删除<布局标签 “的xmlns:机器人=” HTTP://模式.android.com/apk/res/android“ xmlns:app =”http://schemas.android.com/apk/res-auto“并将这两个属性移动到” mmmatey

+0

我移动了命名空间声明来合并,但它没有帮助。我无法删除布局标记,因为我不会得到任何绑定。我所有的customView都是以这种方式创建的,它们是加工。只有这个很混乱 – masztalski

+0

好的,如果你在DayTileView中尝试不同的权重,那么权重呢? – mmmatey

回答

0

我发现问题是什么: 我overrogided onMeasure并没有测量子视图。之前我使用这样的代码来制作正方形View不是正方形的ViewGroup。

更正代码:

final int width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec); 
    setMeasuredDimension(width, width); 
    super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY)); 

设定正确的宽度和高度为View后,我必须测量整个视图与新MeasureSpec

相关问题