Les sauts de ligne disposition widget pour Android
Je suis en train de créer une activité qui présente des données relatives à l'utilisateur. Les données sont tels qu'il peut être divisé en "mots", chacun étant un widget, et la séquence de "mots" forme les données ('phrase'?), le ViewGroup widget contenant les mots. Comme l'espace nécessaire pour tous les "mots" dans une "phrase" permettrait de dépasser l'espace horizontal disponible sur l'écran, j'aimerais conclure ces "phrases", comme vous le feriez pour un morceau de texte.
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);
}
}
rendements de quelque chose comme l'image de gauche, mais je voudrais une mise en page présentant les mêmes widgets comme dans celle de droite.
Est-il une telle disposition ou de la combinaison de mises en page et les paramètres, ou dois-je mettre en place mon propre ViewGroup pour cela?
Vous devez vous connecter pour publier un commentaire.
Depuis le mois de Mai 2016, il y a la nouvelle mise en page appelée FlexboxLayout de Google, ce qui est hautement configurable pour le but que vous voulez.
FlexboxLayout dans Google répertoire GitHub à https://github.com/google/flexbox-layout en ce moment.
Vous pouvez l'utiliser dans votre projet en ajoutant de la dépendance à votre
build.gradle
fichier:Plus sur FlexboxLayout d'utilisation et de tous les attributs que vous pouvez trouver dans le dépôt readme ou dans la Marque Allison articles ici:
https://blog.stylingandroid.com/flexboxlayout-part-1/
https://blog.stylingandroid.com/flexboxlayout-part2/
https://blog.stylingandroid.com/flexboxlayout-part-3/
J'ai fait ma propre mise en page qui fait ce que je veux, mais c'est assez limité pour l'instant. Les commentaires et les suggestions d'amélioration sont les bienvenus.
L'activité:
Ou dans un fichier XML de mise en page:
Et la Mise en page:
Avec le résultat de:
Margin Left
etMargin Top
entre les éléments qui sont ajoutés ?J'ai mis en place quelque chose de très similaire à cela, mais en utilisant ce que je pense, est un peu plus standard de la manière de gérer l'espacement et le rembourrage. S'il vous plaît laissez-moi savoir ce que vous en pensez, et n'hésitez pas à réutiliser sans attribution:
Cela nécessite aussi une entrée dans /res/values/attrs.xml, que vous pouvez créer si elle n'existe pas déjà.
Utilisation dans un xml de mise en page ressemble à ceci:
La android-flowlayout projet par ApmeM soutien des sauts de ligne, trop.
Voici mon simplifié, code version:
Il y a un problème avec la première Réponse:
Dans une liste, par exemple, les éléments de la liste sont passés d'un heightMeasureSpec de 0 (non spécifié) et donc, ici, le MeasureSpec de taille 0 (AT_MOST) est passée à tous les enfants. Cela signifie que l'ensemble de la PredicateLayout est invisible (hauteur 0).
Comme une solution rapide, j'ai changé l'enfant hauteur MeasureSpec comme ceci:
et puis
qui semble fonctionner pour moi bien que ne gère pas le mode EXACT qui serait beaucoup plus difficile.
Ma version légèrement modifiée basée sur posté ici précédemment:
Il des centres de tous les éléments horizontalement
J'ai mis à jour pour corriger un bug, maintenant, chaque ligne peut avoir une hauteur différente !
Les différentes réponses ici pourrait me donner un ClassCastException dans le Exclipse mise en page de l'éditeur. Dans mon cas, j'ai voulu utiliser ViewGroup.MarginLayoutParams plutôt que de faire mon propre. De toute façon, assurez-vous de retourner l'instance de LayoutParams que votre mise en page personnalisée les besoins de la classe dans generateLayoutParams. C'est ce que le mien ressemble, il suffit de remplacer MarginLayoutParams avec l'un de vos ViewGroup besoins:
Il ressemble à cette méthode est appelée à attribuer une LayoutParams objet pour chaque enfant dans le ViewGroup.
J'ai adapté certains de l'ode ci-dessus et mis en œuvre une disposition de flux qui les centres de toutes les vues enfant, horizontal et vertical. Il correspond à mes besoins.
Essayer de définir à la fois de lp's LayoutParams être
WRAP_CONTENT
.Réglage mlp être
WRAP_CONTENT
,WRAP_CONTENT
garantit que votre TextView(s) t sont juste assez large et assez grand suffisante pour tenir un "Bonjour" ou n'importe quelle Chaîne de caractères que vous mettez en eux. Je pense que l peut ne pas être conscient de la façon dont l'échelle de votre ts'sont. LesetSingleLine(true)
, contribue peut-être trop.