0

ページを水平にスワイプしようとしていますが、取得していNullPointerExceptionます。3ページをスワイプしようとしていますが、それらのページの1つでそのテキストビューでtextviewとonclicklistenerを使用しています。アプリケーションを実行すると、例外が継続的に表示されます。

ここに私のlogcatがあります

01-08 19:07:21.400: E/AndroidRuntime(22391): FATAL EXCEPTION: main
01-08 19:07:21.400: E/AndroidRuntime(22391): java.lang.NullPointerException
01-08 19:07:21.400: E/AndroidRuntime(22391):    at com.programr.dishoom.HotelMap.showHotelMap(HotelMap.java:184)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at com.programr.dishoom.HotelMap$MyPagerAdapter.instantiateItem(HotelMap.java:131)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:801)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.support.v4.view.ViewPager.populate(ViewPager.java:930)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.support.v4.view.ViewPager.populate(ViewPager.java:881)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1366)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.view.View.measure(View.java:12937)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5045)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.view.View.measure(View.java:12937)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5045)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
01-08 19:07:21.400: E/AndroidRuntime(22391):    at android.view.View.measure(View.java:12937)
 01-08 19:07:21.400: E/AndroidRuntime(22391):   at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)

これが私の完全なコードです。

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_hotel_map);
    menuList =  (ListView)findViewById(R.id.listView2);        
    }        
    MyPagerAdapter adapter = new MyPagerAdapter();
     myPager = (ViewPager) findViewById(R.id.myfivepanelpager);
     myPager.setAdapter(adapter);
     myPager.setCurrentItem(3);      
}

private class MyPagerAdapter extends PagerAdapter {

    public int getCount(){
        return 3;
    }

    public Object instantiateItem(View collection, int position) {

        LayoutInflater inflater = (LayoutInflater) collection.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        int resId = 0;
        switch (position) {
        case 0: 
            resId = showHotelContact();             
            break;
        case 1:
            resId = showHotelAddress();         
            break;              
        case 2:     
            resId = showHotelMap();             
            break;      
        }

        View view = inflater.inflate(resId, null);
        ((ViewPager) collection).addView(view, 0);
        return view;
    }

    @Override
    public void destroyItem(View arg0, int arg1, Object arg2) {
        ((ViewPager) arg0).removeView((View) arg2);

    }

    @Override
    public void finishUpdate(View arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == ((View) arg1);

    }

    @Override
    public void restoreState(Parcelable arg0, ClassLoader arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public Parcelable saveState() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void startUpdate(View arg0) {
        // TODO Auto-generated method stub

    }

}

public int showHotelMap()
{
    int resId;
    resId = R.layout.clickformap;
TextView clickOnMap = (TextView)findViewById(R.id.clickmap);

clickOnMap.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        Intent intent = new Intent (getApplicationContext(),ShowMap.class);
        startActivity(intent);

    }
});
    return resId;
}
public int showHotelAddress()
{
    int resId;
    resId = R.layout.hoteladdress;
    return resId;
}
public int showHotelContact()
{
    int resId;
    resId = R.layout.hotelcontact;
    return resId;
}

}

このエラーが発生する理由がわかりません。
何かヒントや参考になれば幸いです。

4

3 に答える 3

2

呼び出しているコンテキストfindViewById()はアクティビティ内にあります。これにより、アクティビティsetContent()のメソッドを介して設定したメイン レイアウトがチェックされます。onCreate()TextViewR.id.clickmapが Activity に渡したビューの一部でない場合、それは見つかりません。

Activity クラス自体は、PagerAdapter で作成/破棄されているビューを認識しないため、それらを見つけることができません。が機能するfindViewById()には、クラスを含む親ビューへの参照で呼び出す必要があります。ビュー階層内の任意の親にすることができますが、親またはビュー自体である必要があります。

編集:

をどのように呼び出しているのかわかりませんがshowHotelMap()、探している TextView を含む親ビューを使用する必要があります。

View mainView = getMainView()
TextView clickOnMap = (TextView) mainView.findViewById(R.id.clickmap);
clickOnMap.setOnClickListener(......);

ここで、getMainView()必要なビューへの参照を取得するメソッドです。その方法は、実装によって異なります。

編集2:

private class MyPagerAdapter extends PagerAdapter {

   ...

   public Object instantiateItem(View collection, int position) {

      LayoutInflater inflater = (LayoutInflater) collection.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

       View returnView = null;
       switch (position) {
          case 0: 
             returnView = showHotelContact(inflater);             
             break;
          ...   
       }

       return returnView;
   }

   ...


   public View showHotelMap(Inflater inflater)
   {
      View returnView = inflater.inflate(R.layout.clickformap, null);
      TextView clickOnMap = (TextView)returnView.findViewById(R.id.clickmap);

      clickOnMap.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            Intent intent = new Intent (getApplicationContext(),ShowMap.class);
            startActivity(intent);
         }
      });
      return returnView;
   }
}

この実装ではView、メソッド内で を膨らませ、設定してから に返しPagerAdapterます。ViewPager 自体が呼び出してそれ自体に追加するため、ViewPager に追加する必要はありませんinstantiateItem()

于 2013-01-08T13:52:07.213 に答える
1

次の場所にNullPointerExceptionがあります。

TextView clickOnMap = (TextView)findViewById(R.id.clickmap);
clickOnMap.setOnClickListener(new View.OnClickListener()...

おそらくR.id.clickmapはTextViewの正しい ID ではなく、findViewByIdclickOnMapに null を返している場合は、 onClickListenerを null オブジェクトに設定しようとします。

于 2013-01-08T13:54:08.427 に答える
1

を使用する場合はfindViewByID()、親ビューで参照する必要があります。

このようなものを使用する必要があります。

TextView clickOnMap = (TextView)ActivityName.this.findViewById(R.id.clickmap);
于 2013-01-08T14:01:15.397 に答える