我正在创建一个非常简单的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中某些功能的工作缺乏了解。
答案 0 :(得分:2)
您的直接问题是,findViewById
查看layout
您用setContentView()
充气,因为您试图充气的Views
不在layout
{1}},他们返回null
。
所以这一行返回null
LinearLayout layout = (LinearLayout) findViewById(R.id.entryLayout);
会在您看到
的情况下在此行导致NPE
TextView text = (TextView) layout.getChildAt(0);
因为layout
是null
。
ListView
的方式。由于您希望对行使用自定义layout
,因此您应该使用自定义Adapter
并在那里对相应的layout
进行充气。然后,您可以使用Adapter
的{{1}}方法根据需要设置每行中的数据。
This tutorial可以帮助您开始使用它。