wake-up-neo.com

RelativeLayout Add Regel "RelativeLayout.LEFT_OF" funktioniert nicht

Ich habe ein relatives Layout wie folgt:

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

Im Java-Code möchte ich links neben der Listenansicht eine Ansicht hinzufügen, die jedoch nicht funktioniert hat:

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

nur wenn ich die Listenansicht auf alignParentRight stelle, funktioniert es. Ist das ein Android-Fehler oder fehlt mir etwas? 

Ich versuche immer addView(View child, int index, LayoutParams params), aber es funktioniert möglicherweise nur im linearen Layout. Gibt es eine normale Lösung, um den RelativeLayout.LEFT_OF zum Laufen zu bringen?

EDIT

Ich habe RelativeLayout.BELOW und RelativeLayout.RIGHT_OF ausprobiert, und sie funktionierten einwandfrei. Das heißt, ich habe nicht genügend Platz, um den Button zu bekommen. Ich habe versucht, mehr Platz zu schaffen, aber es funktioniert immer noch nicht.

Ich verwende Toshiba AT100 (1280 * 800) und Querformat, daher ist der Platz ausreichend. Testen Sie below und right genauso wie left. Wenn ich ein Steuerelement A in das relativeelayout setze, füge ich Steuerelement B hinzu und decalare befindet sich auf der linken Seite von Steuerelement A. Das Ergebnis sollte das Steuerelement B sein.

15
dreamtale

Wenn ich ein Steuerelement A in das relativeelayout setze, füge ich Steuerelement B hinzu und erkläre, dass es sich links von Steuerelement A befindet. Das Ergebnis sollte das Steuerelement B sein. Schieben Sie das Steuerelement A nach rechts, oder? 

Ihre Annahme ist falsch, das Steuerelement A wird nicht nach rechts verschoben, es sei denn, Sie haben dies mit einer RelativeLayout.LayoutParams-Regel angegeben. RelativeLayout platziert die untergeordneten Elemente in der linken oberen Ecke des Bildschirms, wenn Sie keine Platzierungsregeln angeben. Wenn Sie View A ohne Regeln (wie layout_alignParentRight) zur RelativeLayout hinzufügen, wird sie in der linken oberen Ecke des Bildschirms platziert. Wenn Sie dann die Variable View B hinzufügen, gilt die Regel to_leftOf für diese View-Position. Diese Regel bedeutet jedoch nichts für die View A, die ihre Position auf dem Bildschirm beibehält. Dadurch wird View B links von View A platziert, aber außerhalb des Bildschirms als View A Grenzen beginnen am linken Bildschirmrand.

Die Button wird links von der ListView platziert, wenn Sie layout_alignParentRight="true" verwenden, da jetzt Platz vorhanden ist, um die Button wirklich zu sehen (sie ist nicht mehr außerhalb). addView(View child, int index, LayoutParams params) funktioniert in einer LinearLayout, da die LinearLayout ihre untergeordneten Elemente in einer Zeile oder Spalte anordnet (abhängig von der Ausrichtung). Wenn Sie also eine View an einer bestimmten Position hinzufügen, wird die andere Views nach rechts oder darunter verschoben (je nach Ausrichtung). (Es gibt keine relative Positionierung der Ansichten in einer LinearLayout, die einzige Regel ist, dass die Kinder nacheinander kommen).

Beginnend mit der ListView ohne irgendwelche Regeln, hier ein Beispiel, wie man die Button links von der ListView erscheinen lässt:

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

Die Schaltfläche wird normal zum Bildschirm hinzugefügt und erscheint in der oberen linken Ecke des Bildschirms. Ohne die beiden Zeilen aus dem Code überlappen sich Button und ListView, da dies das normale Verhalten von RelativeLayout für Kinder ohne Regeln ist. Wir ändern dann explizit die Position der ListView, um sie nach rechts zu verschieben (mit den letzten beiden Zeilen des obigen Codes).

22
Luksprog

Wenn Ihre Variablennamen indikativ sind, liegt dies daran, dass Sie das Widget zu einem LinearLayout hinzufügen. Tags für ein RelativeLayout werden daher ignoriert.

Diese Zeile ist die, über die ich spreche:

m_linearLayout.addView(button2, layoutParams);

EDIT

Sie sagen, alignParentRight funktioniert ... der einzige Unterschied besteht darin, dass ot keinen Ankerparameter verwendet. Vielleicht gibt m_listView.getId() nicht die richtige ID zurück. Sie können den Debugger schrittweise durchgehen und prüfen, ob der richtige Wert zurückgegeben wird.

Vielleicht könnten Sie versuchen, die ID spezifisch anzurufen ...

layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.list);
3
Barak

Verwenden Sie dazu die vordefinierte AnsichtIDoder deklarieren Sie eine. Im Ordner " values" create ids.xml füge dann ein Item hinzu:

<item name="imageViewID" type="id"/>

verwenden Sie diese ID in Ihrem Code, in dem Sie eine neue Ansichtsinstanz wie folgt erstellen:

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

oder wir können diese Funktion View.generateViewId () direkt verwenden, um dasselbe auszuführen. So was: 

imageView.setId(View.generateViewId());
2

Ich denke, Sie haben vielleicht vergessen, m_listView zur Sichtbarkeit von RelativeLayout hinzuzufügen, oder m_listView_ wäre GONE.

Könntest du bitte das überprüfen?

1
bhavindesai

setId vor Ausrichten wird aufgerufen, insbesondere für die neue Objektansicht.

1
user3093743

Wenn Sie eine benutzerdefinierte ID und keine regelmäßig generierte Android-ID verwenden (z. B. R.id.my_id), stellen Sie sicher, dass die ID nicht gleich 0 (oder negativ) ist. Andernfalls wird die Regel ignoriert.

0
PatrickNLT