J'ai un relatifLayout 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 souhaite ajouter une vue à gauche de la liste, mais cela n'a pas fonctionné:
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);
seulement si je règle la listview sur alignParentRight , cela fonctionnera. Est-ce un bug Android ou quelque chose me manque?
J'essaie toujours addView(View child, int index, LayoutParams params)
, mais cela pourrait ne fonctionner que dans la représentation linéaire. Donc, existe-t-il une solution normale pour faire fonctionner le RelativeLayout.LEFT_OF
?
MODIFIER
J'ai essayé RelativeLayout.BELOW
et RelativeLayout.RIGHT_OF
, et ils ont parfaitement fonctionné, cela signifie donc que je n'ai pas assez de place pour avoir le bouton? J'ai essayé de donner plus d'espace, mais cela ne fonctionne toujours pas.
J'utilise Toshiba AT100 (1280 * 800) et paysage, l'espace est donc suffisant. Testez below
et right
juste comme le left
. Je pense que si je mets un contrôle A dans le délai relatif, puis que j'ajoute le contrôle B et que je le détecte à gauche du contrôle A, le résultat devrait être le contrôle B poussera le contrôle A à droite, non?
Je pense que si je mets un contrôle A dans le délai relatif, puis j'ajoute le contrôle B et déclare qu'il se trouve à gauche du contrôle A, le résultat devrait être que le contrôle B poussera le contrôle A à sa droite, non?
Votre hypothèse est incorrecte, le contrôle A ne sera pas poussé vers la droite à moins que vous n'ayez spécifié ceci avec une règle RelativeLayout.LayoutParams
. RelativeLayout
place ses enfants l'un en haut les uns des autres en commençant par le coin supérieur gauche de l'écran si vous ne spécifiez pas de règles de placement pour eux. Lorsque vous ajoutez View
A à RelativeLayout
sans règles (comme layout_alignParentRight
), il sera placé en partant du coin supérieur gauche de l'écran. Ensuite, lorsque vous ajoutez View
B, la règle to_leftOf
s'appliquera à cette position View
mais cette règle ne signifie rien pour View
A qui conservera sa position à l'écran. Cela fera que View
B sera placé à gauche de View
A mais en dehors de l'écran en tant que View
A Les limites commencent à partir du bord gauche de l'écran.
Le Button
sera placé à gauche du ListView
lorsque vous utiliserez layout_alignParentRight="true"
car il y a maintenant de la place pour voir le Button
(ce n'est plus à l'extérieur). addView(View child, int index, LayoutParams params)
fonctionne dans un LinearLayout
car le LinearLayout
dispose ses enfants dans une rangée ou une colonne (selon l’orientation). Ainsi, lorsque vous ajoutez un View
à une position spécifique, il pousse l’autre Views
à sa droite ou en dessous (selon l’orientation) (Il n'y a pas de positionnement relatif des vues dans un LinearLayout
, la seule règle est que les enfants viennent les uns après les autres).
En commençant par ListView
sans aucune règle définie, voici un exemple sur la manière de faire en sorte que Button
apparaisse à gauche de ListView
:
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
Button button2 = new Button(this);
button2.setText("I am button 2");
button2.setId(1000);
m_relativeLayout.addView(button2, layoutParams);
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) m_listView
.getLayoutParams();
rlp.addRule(RelativeLayout.RIGHT_OF, button2.getId());
Le bouton sera ajouté normalement à l'écran et il apparaîtra en partant du coin supérieur gauche de l'écran. Sans les deux lignes du code ci-dessus, les variables Button
et ListView
se chevaucheront car il s'agit du comportement normal de RelativeLayout
pour les enfants sans règles. Nous modifions alors explicitement la position de ListView
pour le déplacer à droite (avec les deux dernières lignes du code ci-dessus).
Si vos noms de variable sont indicatifs, c'est parce que vous ajoutez le widget à un LinearLayout. Les balises d'un RelativeLayout sont donc ignorées.
Cette ligne est celle dont je parle:
m_linearLayout.addView(button2, layoutParams);
MODIFIER
Vous dites que alignParentRight
fonctionne ... la seule différence est que ne prend pas de paramètre d'ancrage. Peut-être que m_listView.getId()
ne renvoie pas le bon identifiant. Vous pouvez parcourir le débogueur et voir s'il renvoie une valeur appropriée.
Peut-être que vous pourriez essayer d'appeler l'identifiant spécifiquement ...
layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.list);
Pour l'exécuter, utilisez la vue prédéfinieIDou déclarez-en une. Dans le dossier values create ids.xml ajoutez ensuite un Item comme ceci:
<item name="imageViewID" type="id"/>
utilisez cet identifiant dans votre code lorsque vous créez une nouvelle instance de vue comme ceci:
RelativeLayout layout=new RelativeLayout(context);
ImageView imageView = new ImageView(context);
imageView.setId(R.id.imageViewID);
RelativeLayout.LayoutParams layoutParams = new LayoutParams(50, 50);
layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
layout.addView(imageView, layoutParams);
TextView textView = new TextView(context);
RelativeLayout.LayoutParams textViewParams= new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
textViewParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
textViewParams.addRule(RelativeLayout.BELOW, imageView.getId());
layout.addView(nameView, nameLayoutParams);
ou nous pouvons directement utiliser cette fonction View.generateViewId () pour effectuer la même chose. Comme ça:
imageView.setId(View.generateViewId());
Je pense que vous avez peut-être oublié d'ajouter m_listView
à la visibilité de RelativeLayout
ou m_listView
serait GONE
.
Pouvez-vous s'il vous plaît vérifier pour cela?
setId avant d'appeler align, en particulier pour la nouvelle vue d'objet.
Si vous utilisez un identifiant personnalisé et non un identifiant Android généré régulièrement (par exemple, R.id.my_id
), assurez-vous qu'il ne soit pas égal à 0 (ni négatif), sinon la règle sera ignorée.