0

在我的应用程序中,我正在向屏幕上已经存在的线性布局添加相同的线性布局。这是我尝试添加它的代码:

LinearLayout addItem=(LinearLayout)findViewById(R.id.lladdItem);
                insideScroll.addView(addItem);

我在此处发布的 LogCat 中出现错误:

06-24 14:58:16.873  13304-13304/com.frostbytedev.randomgenie   E/AndroidRuntime: FATAL EXCEPTION: main
        java.lang.NullPointerException
        at android.view.ViewGroup.addView(ViewGroup.java:3148)
        at android.view.ViewGroup.addView(ViewGroup.java:3131)
        at com.frostbytedev.randomgenie.Test.onClick(Test.java:49)
        at android.view.View.performClick(View.java:4204)
        at android.view.View$PerformClick.run(View.java:17355)
        at android.os.Handler.handleCallback(Handler.java:725)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5041)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
        at dalvik.system.NativeStart.main(Native Method)

以及被夸大的 XML:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/lladdItem"
              android:paddingLeft="15dp"
              android:weightSum="100"
              android:layout_width="fill_parent"
              android:layout_height="80dp"
              android:orientation="horizontal">
    <TextView
            android:layout_weight="10"
            android:layout_width="10dp"
            android:layout_height="80dp"
            android:text="2."
            android:id="@+id/tvItem2"/>
    <EditText
            android:layout_weight="90"
            android:layout_width="100dp"
            android:layout_height="80dp"
            android:hint="List Item 2"
            android:id="@+id/etItem2"
            android:paddingTop="50dp"/>

</LinearLayout>

XML 膨胀到:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <ScrollView
            android:layout_width="fill_parent"
            android:layout_height="465dp"
            android:id="@+id/svItems"
            android:layout_gravity="center"
            >
        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="400dp"
                android:orientation="vertical"
                android:id="@+id/insideScroll">

            <LinearLayout
                    android:paddingLeft="15dp"
                    android:weightSum="100"
                    android:layout_width="fill_parent"
                    android:layout_height="80dp"
                    android:orientation="horizontal">
                <TextView
                        android:layout_weight="10"
                        android:layout_width="10dp"
                        android:layout_height="80dp"
                        android:text="1."
                        android:id="@+id/tvItem1"/>
                <EditText
                        android:layout_weight="90"
                        android:layout_width="100dp"
                        android:layout_height="80dp"
                        android:hint="List Item 1"
                        android:id="@+id/etItem1"
                        android:paddingTop="50dp"/>

            </LinearLayout>
            <LinearLayout
                    android:paddingLeft="15dp"
                    android:weightSum="100"
                    android:layout_width="fill_parent"
                    android:layout_height="80dp"
                    android:orientation="horizontal">
                <TextView
                        android:layout_weight="10"
                        android:layout_width="10dp"
                        android:layout_height="80dp"
                        android:text="2."
                        android:id="@+id/tvItem2"/>
                <EditText
                        android:layout_weight="90"
                        android:layout_width="100dp"
                        android:layout_height="80dp"
                        android:hint="List Item 2"
                        android:id="@+id/etItem2"
                        android:paddingTop="50dp"/>

            </LinearLayout>
        </LinearLayout>
    </ScrollView>
<LinearLayout
        android:layout_height="50dp"
        android:layout_width="fill_parent"
        android:orientation="horizontal"
        android:weightSum="100">
    <Button
            android:layout_weight="50"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add"
            android:id="@+id/bAdd"/>

    <Button
            android:layout_weight="50"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Remove"
            android:id="@+id/bRemove"
            android:layout_gravity="center"/>
    </LinearLayout>
</LinearLayout>

爪哇:

package com.frostbytedev.randomgenie;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.*;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Steven on 6/23/13.
 */
public class Test extends Activity implements View.OnClickListener{
    java.util.List<TextView> listOfET = new ArrayList<TextView>();
    LinearLayout insideScroll;
    ScrollView svItems;
    TextView etItem1, etItem2;
    Button Add, Remove;
    int numOfItems = 2, width, height;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dynamictest);
        initialize();
    }

    private void initialize() {
        Add=(Button)findViewById(R.id.bAdd);
        Remove=(Button)findViewById(R.id.bRemove);
        insideScroll=(LinearLayout)findViewById(R.id.insideScroll);
        etItem1=(TextView)findViewById(R.id.etItem1);
        etItem2=(TextView)findViewById(R.id.etItem2);
        svItems=(ScrollView)findViewById(R.id.svItems);
        Add.setOnClickListener(this);
        Remove.setOnClickListener(this);

        listOfET.add(etItem1);
        listOfET.add(etItem2);
    }

    @Override
    public void onClick(View view) {
        switch(view.getId()){
            case R.id.bAdd:
                numOfItems += 1;
                LinearLayout addItem=(LinearLayout)findViewById(R.id.lladdItem);
                insideScroll.addView(addItem);

                break;
            case R.id. bRemove:

                listOfET.remove(numOfItems);
                numOfItems -= 1;
                break;

        }
    }

    private int getDP(float i) {
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        float dp = i;
        float fpixels = metrics.density * dp;
        int pixels = (int) (fpixels + 0.5f);
        return pixels;
    }

}
4

2 回答 2

2

由于您Test.java:49的代码(这可能是罪魁祸首。而且我读取您的 XML 的方式,调用必须返回,因为未在定义您的内容视图 (dynamictest.xml) 的 XML 文件中定义。insideScrollnulladdItemfindViewById(R.id.lladdItem) nulllladdItem

我相信你需要做的是膨胀 lladditem,而不是在它不存在的地方寻找它:

            LayoutInflater inflater = LayoutInflater.from(view.getContext());
            LinearLayout addItem = 
                (LinearLayout) inflater.inflate(R.layout.lladditem, null);
            insideScroll.addView(addItem);
于 2013-06-24T21:45:11.563 回答
0

如果我错了,请纠正我,有很多内容需要查看,但看起来您尝试添加的项目与您膨胀的项目位于不同的 xml 文件中setContentView(),我看不出您在哪里膨胀Layout所以你需要这样做或者那LinearLayout将是null

现在,这无法创建NPEat insideScroll.addView(addItem);并且从我可以看到它已正确初始化。我会尝试清理你的项目,以防编辑器没有对你的 xml 进行更改。

Window --> Project --> Clean...   

并选择您的项目

于 2013-06-24T19:34:11.827 回答