web-dev-qa-db-fra.com

Création de LinearLayout par programme/dynamiquement avec plusieurs vues

J'ai une hiérarchie qui ressemble à ceci:

  • LinearLayout (horizontal)
    • ImageView
    • LinearLayout (vertical)
      • Affichage
      • Affichage
      • Affichage
      • Affichage

Je veux pouvoir ajouter la hiérarchie ci-dessus par itération tant qu'il est possible d'obtenir des données de la base de données (à l'aide de Parse )

J'ai essayé de placer ImageView et LinearLayout sous le parent LinearLayout mais cela ne semble pas fonctionner. Voici mon code dans 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);

Je ne sais pas où je me suis trompé, mon code ne générant aucune erreur. S'il vous plaît aider.

EDIT: J'ai modifié les orientations en conséquence et lorsque je lance l'application, elle ne fonctionne plus. Et provoque une erreur dans LogCat en disant "L'enfant spécifié a déjà un parent. Vous devez d'abord appeler removeView () sur le parent de l'enfant.

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

Vous voulez cette hiérarchie par programme.

- LinearLayout(horizontal) - ImageView - LinearLayout(vertical) - TextView - TextView - TextView - TextView

Ok, commençons par 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);

Et vous avez terminé :)

51
XtreemDeveloper

Dans le fichier XML, LinearLayout a déjà une vue enfant. Il n'est donc pas nécessaire de les ajouter dans le code. 

0
fightorqin

je vous suggère de supprimer le fichier XML et d'utiliser simplement le code complet du côté Java. vous pouvez ajouter les vues par programmation à partir du côté Java. celui-ci de xtreemdeveloper mais je change quelques lignes pour la mise en page parent. 

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

cela ressemblera à ceci dans le code complet = 

   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

Le problème vient du fait que les vues sont déjà ajoutées à la présentation dans le fichier XML. findViewById (trouvez-les) et essayez de les ajouter à nouveau à la mise en page. C'est pourquoi l'application se bloque en se plaignant que, vue a déjà un parent et vous ne pouvez pas l'ajouter à nouveau.

0
Amulya Khare