2017-07-14 1 views
0

Je construis customView étendant LinearLayout et ayant simple 3 enfants (2 TextView et ImageView). Je crée dynamiquement cette vue dans le code et l'ajoute au parent LinearLayout. Cette vue a un fond, donc je peux facilement repérer sur l'écran, qu'il est correctement gonflé à sa place, mais aucun enfant n'est visible. J'ai vérifié LayoutInspector et il montre que tout est paramétré correctement (valeurs de texte à TextViews et image pour ImageView), mais en quelque sorte lorsque je tente de les localiser sur inspecteur ils sont présentés comme petit point sur mon CustomView:Personnalisé LinearLayout - childs non visible

enter image description here

Mon CustomView s'appelle DayTileView et est carré avec un fond gris. Comme vous pouvez le voir sur l'inspecteur à gauche, les enfants sont remplis de contenu. Mise en page de vue:

<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> 

Et son code:

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)); 
} 

}

Son utilisation dans un autre CustomView qui est aussi LinearLayout mais l'orientation wiht horizontale (PlannedDayView sur l'inspecteur):

<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> 

Quelqu'un a-t-il une idée de ce qui pourrait se passer (enfants hors de vue)? Lorsque je remplace la fusion pour LinearLayout avec l'orientation verticale et le même arrière-plan tout en mode Conception de la mise en page est visible correctement, donc cela devrait fonctionner.

EDIT: J'ai découvert, que si je définis pendant View Initalization Padding Top à 10px alors le point descend. Donc, il semble que pour certaines raisons Android n'a pas fait pour gonfler correctement TextViews et ImageView

+0

Essayez de supprimer mmmatey

+0

J'ai déplacé des déclarations d'espace de noms à fusionner, mais cela n'aide pas.Je ne peux pas supprimer la balise de mise en page, parce que je n'aurais aucune liaison.Tous mes customViews sont faites de cette manière et ils sont travail. Seulement celui-ci est désordonné – masztalski

+0

Ok, qu'en est-il des poids, si vous essayez différents poids dans DayTileView. – mmmatey

Répondre

0

J'ai découvert quel était le problème: J'ai priorisé surMeasure et n'a pas mesuré les vues enfants. Auparavant, j'utilisais un tel code pour rendre Square View non carré ViewGroup.

code corrigé:

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

Après réglage de la largeur et de hauteur pour la vue je dois mesurer vue entière avec une nouvelle MeasureSpec