当我按下 "add button" 时添加 LinearLayout

add LinearLayout when I press "add button"

我想在按下 "add button" 时在空的 LinearLayout 中添加更多的 LinearLayout。

当我第一次按下 "it works" 时,空的 LinearLayout 显示我想要的但如果我再次按下按钮则不起作用(LogCat 告诉我发生了 NullPointerException)。我看到它没有在前一个 LinearLayout 下创​​建一个新的 LinearLayout 并且不知道如何解决它。

让我向您展示我的部分代码:

首先,我创建了

static int  ID=0;
...
LinearLayout mLayout []= new LinearLayout[10];
...

创建时:

...
mLayout[ID] = (LinearLayout) findViewById(R.id.linearLayout_expandir);
...

然后:

private OnClickListener onClick() {
        // TODO Auto-generated method stub
         return new OnClickListener() {
                @Override
                public void onClick(View v) {

                    mLayout[ID].addView(createNewTextView("Contain: ", ID));
                    mLayout[ID].addView(createNewEditText(ID));
                    mLayout[ID].addView(createNewTextView("Nº Liter: ",ID));
                    mLayout[ID].addView(createNewEditText(ID));
                    ID++;                   
                }   
         };
    }

XML:(这个 LinearLayout 是空的:没有 EditText、Buttons 等,并且在另一个 LinearLayout 中)

(来自其他 LinearLayouts 的更多代码)

 <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="0.66"
            android:orientation="horizontal" 
            android:id="@+id/linearLayout_expandir">
 </LinearLayout>

(来自其他 LinearLayouts 的更多代码)

感谢您的宝贵时间!

一个问题:您只有 1 个 LinearLayout,为什么要创建一个 LinearLayout 数组,而不是向 LinearLayout 添加另一个 LinearLayout?

错误可能发生在ID变为1时,mLayout[1]还没有初始化,你正在尝试向它添加另一个视图。

LinearLayout expandir = (LinearLayout) findViewById(R.id.linearLayout_expandir);

在 onClick() 方法中:

public void onClick(View v) {
    LinearLayout linearLayout = new LinearLayout(context);
    linearLayout.addView(createNewTextView("Contain: ", ID));
    linearLayout.addView(createNewEditText(ID));
    linearLayout.addView(createNewTextView("Nº Liter: ",ID));
    linearLayout.addView(createNewEditText(ID));
    expandir.addView(linearLayout);
    ID++;                   
}

我已经为您创建了一个解决方案。 activity 有一个按钮可以为您生成布局。我使用数组列表而不是数组,但想法是一样的。

这是使用此演示创建的许多嵌套布局的图片。

在您的项目中获得此代码后,您只需添加您提到的 TextView/Edit 文本代码。如果您有任何问题,请告诉我。 :)

public class LinearLayoutActivity extends Activity {

    /*This linear layout is the first container*/
    LinearLayout outerMostLayout;
    /*This array holds the linear layouts that you will create dynamically*/
    List<LinearLayout> subLayouts;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_linear_layout);


        // Initialize your views
        outerMostLayout = (LinearLayout) findViewById(R.id.container_layout);
        subLayouts = new ArrayList<LinearLayout>();
        Button button = (Button) findViewById(R.id.button);

        // Set the button onclick
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // Get a reference to the container layout
                LinearLayout container = outerMostLayout;
                if (!subLayouts.isEmpty()) {
                    // Check to see if we have created any yet new containers yet 
                    //-- If we have, then use the newest container
                    container = subLayouts.get(subLayouts.size() - 1);
                }

                // Initialize the new layout with padding to show the change
                LinearLayout linearLayout = new LinearLayout(LinearLayoutActivity.this);
                linearLayout.setOrientation(LinearLayout.VERTICAL);
                LinearLayout.LayoutParams linearLayoutParams = new LinearLayout.LayoutParams(
                        android.widget.LinearLayout.LayoutParams.MATCH_PARENT,
                        android.widget.LinearLayout.LayoutParams.MATCH_PARENT);
                linearLayout.setLayoutParams(linearLayoutParams);
                linearLayout.setPadding(16, 16, 16, 16);

                // Add textview with linear layout name
                TextView textView1 = new TextView(LinearLayoutActivity.this);
                textView1.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT));
                textView1.setText("Linear Layout: " + (subLayouts.size() + 1));
                textView1.setBackgroundColor(0xff66ff66); // hex color 0xAARRGGBB
                linearLayout.addView(textView1);


                // Add the layout to the array
                subLayouts.add(linearLayout);

                // Set the color of the new layout so that we can see the change
                int size = subLayouts.size();
                if (size % 2 == 0) {
                    // Every even layout will be blue
                    linearLayout.setBackgroundColor(getResources().getColor(R.color.blue));
                } else {
                    // every odd layout will be red
                    linearLayout.setBackgroundColor(getResources().getColor(R.color.red));
                }

                // Finally, add the linear layout to the container layout
                container.addView(linearLayout);
            }
        });
    }
}

这是布局xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="@color/red"
              android:orientation="vertical"
              android:paddingBottom="@dimen/activity_vertical_margin"
              android:paddingLeft="@dimen/activity_horizontal_margin"
              android:paddingRight="@dimen/activity_horizontal_margin"
              android:paddingTop="@dimen/activity_vertical_margin">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Generate"/>

    <LinearLayout
        android:id="@+id/container_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/blue"
        android:orientation="horizontal"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin">
    </LinearLayout>

</LinearLayout>