我的布局有两个XML文件 - main.xml和test.xml。这是test.xml中的代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu_objoptions"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp" >
</ListView>
</LinearLayout>
当我尝试使用
获取ListView的实例时findViewById(R.id.menu_objoptions)
它返回null。那是为什么?
编辑:这是相关的java代码:
public void objClick(String objid, long X, long Y) {
final String objID = objid;
final long x = X;
final long y = Y;
try {
mHandle.runOnUiThread(new Runnable() {
@Override
public void run() {
PopupWindow popUp;
LinearLayout layout;
ListView mainListView;
ArrayAdapter<String> listAdapter;
String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars",
"Jupiter", "Saturn", "Uranus", "Neptune"};
ArrayList<String> planetList = new ArrayList<String>();
planetList.addAll( Arrays.asList(planets) );
listAdapter = new ArrayAdapter<String>(mHandle, R.layout.menu_objoptions_row, planetList);
listAdapter.add( "Ceres" );
listAdapter.add( "Pluto" );
listAdapter.add( "Haumea" );
listAdapter.add( "Makemake" );
listAdapter.add( "Eris" );
popUp = new PopupWindow(mHandle);
layout = new LinearLayout(mHandle);
layout.setOrientation(LinearLayout.VERTICAL);
mainListView = (ListView) mHandle.findViewById( R.id.menu_objoptions );
mainListView.setAdapter( listAdapter );
layout.addView(mainListView);
popUp.setContentView(layout);
popUp.setOutsideTouchable(true);
popUp.showAtLocation(rlmain, Gravity.NO_GRAVITY, 10, 10);
popUp.update((int)x,(int)y, 300, 80);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
此行抛出NullPointerException:
mainListView.setAdapter( listAdapter );
答案 0 :(得分:2)
它返回null。那是为什么?
可能你太早说了。你需要在
之后调用它setContentView(R.layout.someLayout);
被调用。在调用父构造函数之后立即开始初始化其他小部件之前,应调用setContentView
方法。
因此,在您需要初始化案例LinearLayout
中的任何窗口小部件之前,您需要将ListView
设置为 contentView 。
我的建议是在LinearLayout
方法中初始化您的onCreate()
。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.yourLinearLayout); // this must be called first
ListView list = findViewById(R.id.menu_objoptions); // now it should works.
}
答案 1 :(得分:0)
在Oncreate()方法中设置contentViewById(.....)之后,应初始化LinearLayout。
守则应
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
LinearLayout layout = (LinearLayout)findViewById(R.id.menu_objoptions);
确保使用 LinearLayout 参考进行初始化。