获取TextView的NullPointerException

时间:2014-12-04 17:41:52

标签: java android android-layout android-listview nullpointerexception

我正在创建一个非常简单的Android应用程序,作为概念证明和我将在未来创建的应用程序的参考。

我的目标是创建一个ListView,每个项目都包含一个TextView和一个Button,当按下该按钮时会弹出一个Toast来显示该内容TextView

这是我的代码和xml:

main.xml中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<ListView
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:id="@+id/mainListView1"/> 

</LinearLayout>

entry.XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:orientation="horizontal"
android:id="@+id/entryLayout"
>

<TextView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:id="@+id/entryTextView1"
    android:padding="10dp"
    android:textSize="25sp"/>

<ImageButton
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:src="@android:drawable/ic_menu_close_clear_cancel"
    android:id="@+id/entryImageButton"
    />

</LinearLayout>

MainActivity.Class

public class MainActivity extends Activity{
/* Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    // Set main.xml as user interface layout
    setContentView(R.layout.main);

    String[] companies = new String[] { "Test1", "Test2", "Test3",
        "Test4", "Test4", "Test6", "Test7", "Test8", "Test9", "Test10"};

    ArrayList<LinearLayout> views =  new ArrayList<LinearLayout>();
    for(int x=0; x!= companies.length-1; x++){

        LinearLayout layout = (LinearLayout) findViewById(R.id.entryLayout);
        TextView text = (TextView) layout.getChildAt(0);
        text.setText(companies[x]);
        ImageButton button = (ImageButton) layout.getChildAt(1);
        button.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v){
                LinearLayout layout = (LinearLayout) v.getParent();
                TextView view = (TextView) layout.getChildAt(0);
                Toast.makeText(MainActivity.this,view.getText(), Toast.LENGTH_SHORT).show();
            }

        });
        views.add(layout);
    }


    ListView listView = (ListView) findViewById(R.id.mainListView1);
    for(LinearLayout layout: views){
        listView.addView(layout);
    }

}

我得到了一条健康线

TextView text = (TextView) layout.getChildAt(0);

对于我的生活,我无法弄清楚为什么。这可能是由于我对API中某些功能的工作缺乏了解。

1 个答案:

答案 0 :(得分:2)

您的直接问题是,findViewById查看layout您用setContentView()充气,因为您试图充气的Views不在layout {1}},他们返回null

所以这一行返回null

LinearLayout layout = (LinearLayout) findViewById(R.id.entryLayout);

会在您看到

的情况下在此行导致NPE
TextView text = (TextView) layout.getChildAt(0);

因为layoutnull

更大的问题

是您使用ListView的方式。由于您希望对行使用自定义layout,因此您应该使用自定义Adapter并在那里对相应的layout进行充气。然后,您可以使用Adapter的{​​{1}}方法根据需要设置每行中的数据。

This tutorial可以帮助您开始使用它。

您也可以查看Google I/O World of ListView

ListView Docs