0

Je rencontre des difficultés avec une interface utilisateur générée au moment de l'exécution qui ne respecte pas les contraintes. Par d'autres réponses et de la documentation pour Android, j'ai essayé ConstraintSet ainsi que d'autres méthodes.Application de contraintes d'exécution pour ConstraintLayout dans LinearLayout

J'étends ConstraintLayout pour une classe personnalisée qui fait partie intégrante de la fonctionnalité de l'application. Je tire des données d'un serveur Web qui crée ensuite ces objets et les ajoute à un LinearLayout. Les LinearLayout, ConstraintLayout et TextView montrent tous leurs tailles appropriées; cependant, les TextView se chevauchent et refusent de respecter les contraintes.

Je peux créer une copie de ce que je veux faire manuellement via l'éditeur de disposition, et cela fonctionne très bien.

Ma configuration actuelle (this étend ConstraintLayout, text_name et text_points sont TextView s):

this.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 

    this.addView(text_name); 
    this.addView(text_points); 

    ConstraintSet constraints = new ConstraintSet(); 

    constraints.clone(this); 

    constraints.constrainHeight(text_points.getId(), WRAP_CONTENT); 
    constraints.constrainWidth(text_points.getId(), WRAP_CONTENT); 
    constraints.constrainHeight(text_name.getId(), WRAP_CONTENT); 
    constraints.constrainWidth(text_name.getId(), WRAP_CONTENT); 

    constraints.connect(text_name.getId(), LEFT, getId(), LEFT); 
    constraints.connect(text_points.getId(), RIGHT, getId(), RIGHT); 

    constraints.applyTo(this); 

constrainWidth et constrainHeight travail; quand je m'en débarrasse ou que je change les valeurs, cela a un effet. Cependant, aucune des affaires de connect ne fait rien. Les TextView ont les bonnes tailles pour leur texte, mais n'obéissent à aucune contrainte. Ai-je manqué une ligne qui fait .connect s travail? Pour clarifier: J'ai ScrollView ->LinearLayout ->ConstraintLayout ->Lorsqu'elles sont créées dans l'éditeur, les contraintes fonctionnent correctement. Lorsqu'elles sont créées dans l'instanciation du ConstraintLayout lors de l'exécution à l'aide d'un ConstraintSet, les contraintes connectées n'ont aucun effet, contrairement aux autres propriétés.

Display in-app - TextViews overlap, not following constraints

EDIT: Juste pour confirmer, voici une sortie du nombre de lignes ajoutées à la LinearLayout (LOCS), la taille de la LinearLayout (LDIM), la taille de la ConstraintLayout (LOCDIM) et tailles les TextViews (TVDIM, TV2DIM):

09-03 14:19:18.664 D/LOCS: 2 
09-03 14:19:18.665 D/LDIM: 1080 w 
09-03 14:19:18.665 D/LDIM: 58 h 
09-03 14:19:18.665 D/LOCDIM: 1080 w 
09-03 14:19:18.666 D/LOCDIM: 29 h 
09-03 14:19:18.667 D/TVDIM: 165 w 
09-03 14:19:18.667 D/TVDIM: 29 h 
09-03 14:19:18.668 D/TV2DIM: 29 w 
09-03 14:19:18.668 D/TV2DIM: 29 h 

Répondre

0

Le problème est que, par programme, Vue ids ne sont pas correctement assignés. Je l'ai découvert en essayant différentes combinaisons de marge, de largeur, de hauteur, d'échelle et de rotation - les deux vues avaient toutes les mêmes modifications.

La solution consiste à définir les ID vous-même en les générant d'une manière ou d'une autre. Cependant, en ciblant les versions API faibles (< 17), View.generateViewId() n'est pas autorisé; ainsi, vous devez utiliser un de ces blocs malheureusement laid enroulé autour de lui:

int view_id; 

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { 
    view_id = View.generateViewId(); 
} else { 
    view_id = new Random(System.currentTimeMillis()).nextInt(); 
} 

view.setId(view_id); 

A partir de là, vous pouvez utiliser view_id ou view.getId() pour ConstraintSet.

Pour le parent du View s que vous souhaitez ajouter au ConstraintLayout, vous pouvez utiliser ConstraintSet.PARENT_ID.

0

voir cette réponse, je pense que vous manquez l'instruction clone().

Add view programatically in ConstraintLayout

+0

Pas de chance avec celui-ci.Est-il possible qu'il devrait être fait après le premier rendu? –

+0

Ces méthodes que j'ai supposé ont été utilisées dans une méthode onCreate Activity ou une méthode onCreateView Fragment. Je n'ai jamais essayé dans le cadre de la vue. Si vous publiez votre mise en page, je pourrais être en mesure de fournir des informations supplémentaires. Je pense que la façon dont vous essayez est plus compliquée. – Juan

+0

Je diffuse des données à partir d'un serveur Web étant donné l'emplacement actuel de l'appareil. Sûrement chargement dynamique des données a déjà été fait! La disposition est comme dit avant - 'ScrollView' ->' LinearLayout' -> 'ConstraintLayout' ->' TextView'. ConstraintLayout et TextViews sont créés lorsque les données sont chargées. Extended ConstraintLayout pour le constructeur personnalisé afin de transmettre des données. L'extrait ci-dessus provient du constructeur de la classe qui s'étend. –