it-swarm.com.de

Lineares Layout programmatisch/dynamisch mit mehreren Ansichten erstellen

Ich habe eine Hierarchie, die so ist:

  • LinearLayout (horizontal)
    • Bildansicht
    • LinearLayout (vertikal)
      • Textvorschau
      • Textvorschau
      • Textvorschau
      • Textvorschau

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

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

51
XtreemDeveloper

In der XML-Datei hat LinearLayout bereits eine untergeordnete Ansicht. Sie müssen also nicht im Code hinzugefügt werden. 

0
fightorqin

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);
0
java person

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.

0
Amulya Khare