web-dev-qa-db-fra.com

RelativeLayout ajouter la règle "RelativeLayout.LEFT_OF" ne fonctionne pas

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?

15
dreamtale

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).

22
Luksprog

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);
3
Barak

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());
2

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?

1
bhavindesai

setId avant d'appeler align, en particulier pour la nouvelle vue d'objet.

1
user3093743

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.

0
PatrickNLT