多个布局文件Android

时间:2013-02-21 08:53:19

标签: android android-layout

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

2 个答案:

答案 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 参考进行初始化。