J'essaye de créer une activité qui présente des données à l'utilisateur. Les données sont telles qu'elles peuvent être divisées en «mots», chacun étant un widget, et une séquence de «mots» formerait les données («phrase»?), Le widget ViewGroup contenant les mots. Comme l'espace requis pour tous les «mots» dans une «phrase» dépasserait l'espace horizontal disponible sur l'écran, je voudrais encapsuler ces «phrases» comme vous le feriez pour un morceau de texte normal.
Le code suivant:
public class WrapTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout l = new LinearLayout(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams mlp = new LinearLayout.LayoutParams(
new ViewGroup.MarginLayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
mlp.setMargins(0, 0, 2, 0);
for (int i = 0; i < 10; i++) {
TextView t = new TextView(this);
t.setText("Hello");
t.setBackgroundColor(Color.RED);
t.setSingleLine(true);
l.addView(t, mlp);
}
setContentView(l, lp);
}
}
donne quelque chose comme l'image de gauche, mais je voudrais une mise en page présentant les mêmes widgets que celle de droite.
Existe-t-il une telle disposition ou combinaison de dispositions et de paramètres, ou dois-je implémenter mon propre ViewGroup pour cela?
la source
J'ai fait ma propre mise en page qui fait ce que je veux, mais elle est assez limitée pour le moment. Les commentaires et suggestions d'amélioration sont bien sûr les bienvenus.
L'activité:
Ou dans une mise en page XML:
Et la mise en page:
Avec le résultat:
la source
J'ai implémenté quelque chose de très similaire à celui-ci, mais en utilisant ce que je pense, c'est un moyen un peu plus standard de gérer l'espacement et le remplissage. Faites-moi savoir ce que vous pensez, et n'hésitez pas à réutiliser sans attribution:
Cela nécessite également une entrée sous /res/values/attrs.xml, que vous pouvez créer si ce n'est déjà fait.
L'utilisation dans une mise en page XML ressemble à ceci:
la source
Le projet android-flowlayout d'ApmeM prend également en charge les sauts de ligne.
la source
Voici ma version simplifiée, code uniquement:
la source
Il y a un problème avec la première réponse:
Dans un ListView, par exemple, les éléments de la liste reçoivent une heightMeasureSpec de 0 (UNSPECIFIED) et donc, ici, la MeasureSpec de taille 0 (AT_MOST) est passée à tous les enfants. Cela signifie que tout le PredicateLayout est invisible (hauteur 0).
En guise de solution rapide, j'ai changé la hauteur de l'enfant MeasureSpec comme ceci:
puis
qui semble fonctionner pour moi bien que ne gère pas le mode EXACT, ce qui serait beaucoup plus délicat.
la source
Ma version légèrement modifiée basée sur posté ici précédemment:
Il centre tous les éléments horizontalement
la source
J'ai mis à jour cet exemple pour corriger un bug, maintenant, chaque ligne peut avoir une hauteur différente!
la source
Certaines des différentes réponses ici me donneraient une ClassCastException dans l'éditeur de mise en page Exclipse. Dans mon cas, je voulais utiliser ViewGroup.MarginLayoutParams plutôt que de créer le mien. Dans tous les cas, assurez-vous de renvoyer l'instance de LayoutParams dont votre classe de disposition personnalisée a besoin dans generateLayoutParams. Voici à quoi ressemble le mien, remplacez simplement MarginLayoutParams par celui dont votre ViewGroup a besoin:
Il semble que cette méthode soit appelée pour attribuer un objet LayoutParams à chaque enfant du ViewGroup.
la source
la source
J'ai adapté une partie de l'ode ci-dessus et mis en œuvre une disposition de flux qui centre toutes les vues enfants, horizontales et verticales. Cela correspond à mes besoins.
la source
essayez:
la source
Essayez de régler les deux lp de LayoutParams de » être
WRAP_CONTENT
.Définir mlp comme étant
WRAP_CONTENT
,WRAP_CONTENT
garantit que votre (vos) TextView (s) t sont juste assez larges et suffisamment hauts pour contenir "Hello" ou toute autre chaîne que vous y mettez. Je pense que je ne suis peut-être pas conscient de la largeur de vos t . LesetSingleLine(true)
peut aussi contribuer.la source