0

レイアウト用に main.xml と test.xml の 2 つの 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 );
4

2 に答える 2

2

null を返します。何故ですか?

おそらく、あなたはそれを早すぎると言います。後で呼び出す必要があります

setContentView(R.layout.someLayout);

と呼ばれます。setContentViewメソッドは、親のコンストラクターを呼び出した直後に、別のウィジェットの初期化を開始する前に呼び出す必要があります。

アップデート:

したがって、あなたのケースでは、ケース内のウィジェットを初期化する前に、コンテンツ ビューLinearLayoutとして設定する必要があります。ListView

私の提案は、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 に答える