RelativeLayout ajouter une règle “RelativeLayout.LEFT_OF” ne fonctionne pas
J'ai un relativeLayout comme ci-dessous:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:id="@+id/parent" >
<ListView
android:layout_width="360dp"
android:layout_height="600dp"
android:id="@+id/list"
android:inputType="text"
android:maxLines="1"
android:layout_margin="50dp"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
Dans le code java, je veux ajouter une vue sur la gauche de la liste, mais il n'a pas travaillé:
m_relativeLayout = (RelativeLayout)findViewById(R.id.parent);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.LEFT_OF, m_listView.getId());
Button button2 = new Button(this);
button2.setText("I am button 2");
m_relativeLayout.addView(button2, layoutParams);
que si j'ai mis la liste à alignParentRight, il va fonctionner. Est-ce un android bug ou je suis absent quelque chose?
J'essaie toujours addView(View child, int index, LayoutParams params)
, mais il peut ne fonctionner que dans le linearlayout. Donc, il y a une solution normale de faire de la RelativeLayout.LEFT_OF
travail?
MODIFIER
J'ai essayé RelativeLayout.BELOW
et RelativeLayout.RIGHT_OF
, et ils ont parfaitement fonctionné, donc, cela signifie que je n'ai pas assez de place pour que le bouton? J'ai essayé de donner plus d'espace, mais toujours pas de travail.
- Je utiliser Toshiba AT100 (1280*800) et du paysage, de sorte que l'espace est suffisant. Test below
et right
vient de même que la left
. Je pense que Si je mets un contrôle, d'Un relativelayout, puis-je ajouter de contrôle B et decalare il est sur la gauche de la commande, le résultat devrait être le contrôle de la B va pousser le contrôle de l'Un à sa droite, droite?
Le relativelayout est le mainview de l'activité, et il a de l'espace pour ajouter le bouton.
En fait je veux dire, ne le touche pas, ou alors ils apparaissent dans un lieu inapproprié?
Le bouton s'affiche pas.
OriginalL'auteur dreamtale | 2012-05-22
Vous devez vous connecter pour publier un commentaire.
Votre hypothèse est incorrecte, le contrôle d'Une volonté de ne pas être poussé vers la droite, sauf si vous avez spécifié avec un
RelativeLayout.LayoutParams
règle.RelativeLayout
place ses enfants un un haut de chaque autre en commençant par le coin supérieur gauche de l'écran, si vous ne spécifiez pas les règles de placement pour eux. Lorsque vous ajoutez leView
Un à l'RelativeLayout
sans règles(commelayout_alignParentRight
), il sera placé en partant du coin en haut à gauche de l'écran. Ensuite, lorsque vous ajoutez leView
B, la règleto_leftOf
cetteView
position, mais cette règle ne signifie rien pour leView
Un qui va maintenir sa position sur l'écran. Cela va faireView
B à la place à la gauche deView
Un, mais à l'extérieur de l'écran, commeView
Une des limites de commencer à partir de la bordure gauche de l'écran.La
Button
sera placé à la gauche de laListView
lorsque vous utilisezlayout_alignParentRight="true"
parce qu'il est maintenant l'espace pour voir laButton
(ce n'est pas plus dehors).addView(View child, int index, LayoutParams params)
travaille dans unLinearLayout
parce que leLinearLayout
organise ses enfants dans une ligne ou une colonne(selon l'orientation) ainsi, lorsque vous ajoutez unView
à une position spécifique, il va pousser les autresViews
après à droite ou au-dessous(selon l'orientation)(il n'y a pas de positionnement relatif des points de vue dans unLinearLayout
, la seule règle est que les enfants viennent l'un après l'autre).En commençant par le
ListView
sans règles fixés sur elle, voici un exemple sur la façon de faire de laButton
à apparaître sur la gauche de laListView
:Le Bouton sera ajouté à la normale à l'écran et il apparaîtra à partir de l'angle supérieur gauche de l'écran. Sans les deux lignes de code au-dessus de la
Button
etListView
se chevauchent comme c'est le comportement normal deRelativeLayout
pour les enfants sans aucune règles. Nous avons ensuite explicitement à modifier la position de laListView
pour le déplacer vers la droite(avec les deux dernières ligne du code ci-dessus).below
etright
vient de même que laleft
. Je pense que Si je mets un contrôle, d'Un relativelayout, puis-je ajouter de contrôle B et decalare il est sur la gauche de la commande, le résultat devrait être le contrôle de la B va pousser le contrôle de l'Un à sa droite, droite?J'ai mal compris votre question la première fois. J'ai édité ma réponse, voir si cela aide.
Merci pour élaborer votre réponse, je l'ai fait il a travaillé 🙂
OriginalL'auteur Luksprog
Si vos noms de variable sont donnés à titre indicatif, c'est parce que vous êtes d'ajouter le widget à un LinearLayout, de sorte que les balises pour un RelativeLayout ignoré.
Cette ligne est celle dont je parle:
MODIFIER
Vous dire
alignParentRight
fonctionne... la seule différence est que les heures supplémentaires ne prend pas un ancrage paramètre. Peut-êtrem_listView.getId()
n'est pas le retour de la bonne id. Vous pourriez étape avec le débogueur et voir si elle retourne une valeur correcte.Vous pourriez peut-être essayer d'appeler l'id...
Non, je veux dire vous avez besoin pour ajouter une vue à un RelativeLayout pour RelativeLayout règles de travail. Ce point de vue de référence, dit
m_linearlayout
, qui me dit que vous tentez d'ajouter le point de vue d'un LinearLayout au lieu d'un RelativeLayout. Puisque vous n'avez pas indiqué l'endroit où vous définissez lesm_linearlayout
référence, je suis en supposant que vous utilisez un nom approprié. Sauf si vous avezm_linearlayout = (RelativeLayout) this.findViewById(R.id.parent)
quelque part, dans ce cas, je dirais que vous avez choisi une mauvaise référence nom de votre parent de mise en page.Désolé pour ça, je l'ai essayé dans un avant projet, et il suffit de remplacer le
LinearLayout
àRelativeLayout
et ne pas changer le nom de la variable. J'ai modifier la question.Mise à jour de ma réponse.
Pas travaillé encore. - Je mettre à jour la question.
OriginalL'auteur Barak
Pour l'exécuter, utiliser de vue prédéfinie ID ou de les déclarer. Dans valeurs de dossier créer ids.xml puis ajouter un Élément comme ceci:
utiliser ce code dans votre code lorsque vous créez une nouvelle Instance de la vue comme:
ou nous pouvons directement utiliser cette fonction Vue.generateViewId() pour effectuer le même. Comme ceci:
OriginalL'auteur Manoj Singh Rawal
Je pense que vous avez oublié d'ajouter
m_listView
à laRelativeLayout
oum_listView
's la visibilité seraitGONE
.Pouvez-vous s'il vous plaît vérifier que?
Comme je vois que vous êtes paramètre de mise en page paramètres de rapport de mise en page, mais vous ajoutez bouton linéaire de la mise en page. Eiter utilisation LinearLayout.LayoutParams plutôt que RelativeLayout.LayoutParams ou appelez addView méthode d'instance de la RelativeLayout.
Voir mon édité question.
OriginalL'auteur bhavindesai
setId avant d'aligner est appelée, en particulier pour le nouvel objet de la vue.
OriginalL'auteur user3093743
Si vous utilisez un identifiant et n'est pas régulier généré Android id (par exemple.
R.id.my_id
), assurez-vous que l'id n'est pas égal à 0 (ou négatif), sinon, la règle sera ignoré.OriginalL'auteur PatrickNLT