0

J'ai un RelativeLayout avec un ConstraintLayout (et quelques autres choses) que je suis en train de remplir par programmation avec les enfants. J'ai du mal à redimensionner le parent RelativeLayout après avoir initialisé toutes les vues enfant.Mise à jour des dimensions de la vue après l'ajout des enfants

En fait ce que je suis en train de réaliser est la suivante:

quick mockup

Voici des extraits de code:

@BindView(R.id.session_summary_items_include_correct) View mCardCorrect; 

//... 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_session_summary_items, container, false); 
    ButterKnife.bind(this, view); 
    correctCard = new IncludedCard(); 
    ButterKnife.bind(correctCard, mCardCorrect); 

    initializeViews(); 

    mCardCorrect.post(() -> resizeView(mCardCorrect)); 

    return view; 
} 

private void initializeViews(){ 
    ArrayList<MyClass> items = MyClass.GetItems(); 
    LayoutInflater layoutInflater = (LayoutInflater) getActivity().getApplicationContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  

    if (items.size() > 0){ 
     correctCard.mCardTitle.setText("Correct Card"); 
     ArrayList<View> views = getItemViews(items, layoutInflater); 
     populateLayoutWithItemViews(correctCard.mConstraintLayout, views); 
    } 
} 

private ArrayList<View> getItemViews(ArrayList<MyClass> items, LayoutInflater inflater){ 
    ArrayList<View> results = new ArrayList<>(); 
    for (MyClass item : items){ 
     View view = inflater.inflate(R.layout.item_view, null); 
     TextView mTextTitle = (TextView) view.findViewById(R.id.item_view_title); 
     mTextTitle .setText(item.getTitle()); 
     results.add(view); 
    } 
    return results; 
} 

private void populateLayoutWithItemViews(ConstraintLayout layout, ArrayList<View> items){ 

    ConstraintSet constraintSet = new ConstraintSet(); 
    constraintSet.clone(layout); 

    for (int idx = 0; idx < items.size(); idx ++){ 
     View item = items.get(idx); 
     item.setId(View.generateViewId()); 
     layout.addView(item); 

     // constraintSet magic to make them connect as expected 

    } 

    constraintSet.applyTo(layout); 
} 

private void resizeView(View view){ 

    view.setLayoutParams(new RelativeLayout.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT)); 
} 

static class IncludedCard{ 
    @BindView(R.id.card_title) TextView mCardTitle; 
    @BindView(R.id.card_layout) ConstraintLayout mConstraintLayout; 
} 

Maintenant, la question est que partout où, quand et je vais mesure/redimensionne la vue mCardCorrect, le résultat est le même: il sera mesuré jusqu'au titre de la carte, comme si les éléments enfants de ConstraintLayout n'existaient pas. Comme ceci:

measurement bounding box

J'ai essayé de poster des mesures/redimensionnement à un Runnable comme ici: FrameLayout child view not updating correctly on resize , et en utilisant OnGlobalLayoutListener comme ici: Android: set view height via ViewTreeObserver . Je suis toujours un newb Android et c'est mon premier projet, donc toute aide sera grandement appréciée. Merci!

Répondre

0

Vous devez contraindre chaque vue. De "Build a Responsive UI with ConstraintLayout":

... si une vue n'a pas de contraintes lorsque vous exécutez votre mise en page sur un périphérique, il est tiré à la position [0,0] (le coin en haut à gauche).

Toutes les vues que vous ajoutez ne sont pas contraintes, donc elles se chevauchent toutes en (0, 0).

Il semble que vous ayez correctement configuré le ConstraintSet, il vous suffira d'ajouter les contraintes en utilisant le ConstraintSet. Il y a quelques bons tutoriels en ligne qui montrent comment faire cela. Here en est un. Vous pouvez également vous référer au official documenation.