Ich habe eine Hierarchie, die so ist:
Ich möchte in der Lage sein, die obige Hierarchie durch Iteration hinzuzufügen, solange Daten vorhanden sind, die aus der Datenbank abgerufen werden könnten (mithilfe von Parse ).
Ich habe versucht, ImageView und LinearLayout unter dem übergeordneten LinearLayout zu platzieren, aber es scheint nicht zu funktionieren. Hier ist mein Code in MainActivity.Java:
LinearLayout LL_Outer = (LinearLayout) findViewById(R.id.new_linearLayoutOuter);
LL_Outer.setOrientation(LinearLayout.VERTICAL); // set orientation
LL_Outer.setBackgroundColor(color.white); // set background
// set Layout_Width and Layout_Height
LinearLayout.LayoutParams layoutForOuter = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
LL_Outer.setLayoutParams(layoutForOuter);
LinearLayout LL_Inner = (LinearLayout) findViewById(R.id.new_linearLayoutInner);
LL_Inner.setOrientation(LinearLayout.HORIZONTAL);
LL_Inner.setBackgroundColor(color.white);
LinearLayout.LayoutParams layoutForInner = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
LL_Inner.setLayoutParams(layoutForInner);
//LL_Outer.addView(LL_Inner);
ImageView IV = (ImageView) findViewById(R.id.new_imageViewPP);
//IV.getLayoutParams().height = 55;
//IV.getLayoutParams().width = 55;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(14, 12, 0, 0);
params.height = 55;
params.weight = 55;
IV.setBackgroundColor(color.black);
IV.setLayoutParams(params);
LL_Inner.addView(IV);
LL_Outer.addView(LL_Inner);
Ich weiß nicht, wo ich einen Fehler gemacht habe, da mein Code keinen Fehler angezeigt hat. Bitte helfen.
BEARBEITEN: Ich habe die Orientierungen entsprechend bearbeitet und wenn ich die App starte, funktioniert sie nicht mehr. In LogCat wird ein Fehler angezeigt, der besagt, dass "Das angegebene untergeordnete Objekt bereits über ein übergeordnetes Element verfügt. Sie müssen removeView () zuerst für das übergeordnete untergeordnete Element aufrufen.
Hier ist mein XML:
<LinearLayout
Android:id="@+id/new_linearLayoutOuter"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:background="@color/white"
Android:orientation="horizontal" >
<ImageView
Android:id="@+id/new_imageViewPP"
Android:layout_width="55dp"
Android:layout_height="55dp"
Android:layout_marginLeft="14dp"
Android:layout_marginTop="12dp"
Android:background="@color/black"
Android:contentDescription="@string/pp" />
<LinearLayout
Android:id="@+id/new_linearLayoutInner"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:background="@color/white"
Android:orientation="vertical" >
<TextView
Android:id="@+id/new_textView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/movie_title"
Android:paddingTop="10dp"
Android:paddingLeft="7dp"
Android:textSize="15sp" /> <!-- Title of the movie -->
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/review_by"
Android:paddingTop="3dp"
Android:paddingLeft="7dp"
Android:textSize="12sp" /> <!-- By -->
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/movie_stars"
Android:paddingTop="3dp"
Android:paddingLeft="7dp"
Android:textSize="12sp" /> <!-- Rating and date -->
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/sample_string"
Android:maxLines="5"
Android:scrollbars="vertical"
Android:paddingTop="10dp"
Android:paddingLeft="7dp"
Android:textSize="12sp"
Android:layout_gravity="center_vertical|right" /> <!-- Review content -->
</LinearLayout>
</LinearLayout>
Sie möchten diese Hierarchie programmgesteuert.
- LinearLayout(horizontal)
- ImageView
- LinearLayout(vertical)
- TextView
- TextView
- TextView
- TextView
Ok, beginnen wir mit Parent LinearLayout
LinearLayout parent = new LinearLayout(context);
parent.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
parent.setOrientation(LinearLayout.HORIZONTAL);
//children of parent linearlayout
ImageView iv = new ImageView(context);
LinearLayout layout2 = new LinearLayout(context);
layout2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
layout2.setOrientation(LinearLayout.VERTICAL);
parent.addView(iv);
parent.addView(layout2);
//children of layout2 LinearLayout
TextView tv1 = new TextView(context);
TextView tv2 = new TextView(context);
TextView tv3 = new TextView(context);
TextView tv4 = new TextView(context);
layout2.addView(tv1);
layout2.addView(tv2);
layout2.addView(tv3);
layout2.addView(tv4);
Und du bist fertig :)
In der XML-Datei hat LinearLayout bereits eine untergeordnete Ansicht. Sie müssen also nicht im Code hinzugefügt werden.
ich empfehle Ihnen, die XML-Datei zu entfernen und nur den vollständigen Code auf der Java-Seite zu verwenden. Sie können die Ansichten programmgesteuert von der Java-Seite aus hinzufügen. dieses von xtreemdeveloper, aber ich ändere ein paar Zeilen für das übergeordnete Layout.
// remove this params set it up below
parent.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
// change the code above into
.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
addContentView(parent,layoutParams);
// end of my change
es wird so aussehen in vollem Code =
LinearLayout parent = new LinearLayout(context);
// remove this params set it up below
parent.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
// change the code above into
.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
addContentView(parent,layoutParams);
// end of my change
parent.setOrientation(LinearLayout.HORIZONTAL);
//children of parent linearlayout
ImageView iv = new ImageView(context);
LinearLayout layout2 = new LinearLayout(context);
layout2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
layout2.setOrientation(LinearLayout.VERTICAL);
parent.addView(iv);
parent.addView(layout2);
//children of layout2 LinearLayout
TextView tv1 = new TextView(context);
TextView tv2 = new TextView(context);
TextView tv3 = new TextView(context);
TextView tv4 = new TextView(context);
layout2.addView(tv1);
layout2.addView(tv2);
layout2.addView(tv3);
layout2.addView(tv4);
Das Problem ist, dass die Ansichten bereits zum Layout in der XML
-Datei hinzugefügt werden. Dann findViewById
(finden Sie sie) und versuchen Sie, sie erneut dem Layout hinzuzufügen. Deshalb stürzt die App ab und beschwert sich darüber, dass view bereits ein übergeordnetes Element hat und Sie es nicht erneut hinzufügen können.