使用多个视图以编程方式/动态创建LinearLayout

时间:2013-11-29 10:36:46

标签: java android android-layout android-linearlayout

我的层次结构是这样的:

  • 的LinearLayout(水平)
    • ImageView的
    • 的LinearLayout(垂直)
      • 的TextView
      • 的TextView
      • 的TextView
      • 的TextView

我希望能够通过迭代添加上面的层次结构,只要有数据可以从数据库中获取(使用Parse

我已经尝试将ImageView和LinearLayout放在父LinearLayout下,但它似乎不起作用。这是我在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);

我不知道哪里出错了,因为我的代码没有提示任何错误。请帮忙。

编辑:我已经相应地编辑了方向,当我运行应用程序时,它停止工作。并在LogCat中提示错误,指出“指定的子节点已经有父节点。您必须首先在子节点的父节点上调用removeView()。

这是我的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>

4 个答案:

答案 0 :(得分:52)

您希望以编程方式使用该层次结构。

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

好的,让我们从父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);

你完成了:)

答案 1 :(得分:0)

问题是因为视图已添加到XML文件的布局中。然后你findViewById(找到它们)并尝试再次将它们添加到布局中。这就是为什么应用程序崩溃抱怨,视图已经有父,你不能再添加它。

答案 2 :(得分:0)

我建议您删除xml文件,而仅在Java端使用完整代码。您可以从Java端以编程方式添加视图。这个来自xtreemdeveloper,但我为父级布局更改了几行。

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

完整代码=

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

答案 3 :(得分:-1)

在XML文件中,LinearLayout已经有了子视图。因此不需要在代码中添加它们。