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.
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).
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);
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());
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?
setId vor Ausrichten wird aufgerufen, insbesondere für die neue Objektansicht.
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.