0

我的布局有两个 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)

它返回空值。这是为什么?

编辑:这是相关的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 );
4

2 回答 2

2

它返回空值。这是为什么?

可能你打电话太早了。你需要在之后调用它

setContentView(R.layout.someLayout);

叫做。setContentView方法应该在你开始初始化另一个小部件之前调用,在你调用父构造函数之后立即调用。

更新:

因此,在您的情况下,您需要在要初始化任何小部件之前将您的设置LinearLayoutcontentViewListView

我的建议是初始化你的LinearLayoutinonCreate()方法。

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.
}
于 2013-02-21T08:56:12.187 回答
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参考进行初始化。

于 2013-02-21T09:02:50.560 回答