2013-01-08 110 views
0

我試圖水平滑動頁面,但我得到NullPointerException。我想刷3頁,我在那些頁面中的textview上使用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; 
} 

}

我不明白爲什麼我收到此錯誤。
請給我任何提示或參考。

+0

在清單中定義的所有活動。? –

+0

@SahilMahajanMj:是的 –

回答

2

您打電話給findViewById()的上下文在Activity中。這將通過您的活動的onCreate()方法檢查您在setContent()中設置的主佈局。如果TextView R.id.clickmap不是您傳遞給Activity的視圖的一部分,則不會找到它。

Activity類本身並不知道在PagerAdapter中創建/銷燬的視圖,所以它找不到它們。爲了使findViewById()工作,您需要在對包含該類的父視圖的引用上調用它。它可以是View層次結構中的任何父代,但它必須是父代或視圖本身。

編輯:

我不知道你怎麼叫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()並將其添加到自身。

+0

你可以用參考代碼更新你的答案... –

+0

感謝您的回答......但是我需要在getMainView()中添加什麼?我需要檢索什麼參考? –

+0

好的。看着你的代碼,我想我已經知道你想要做什麼了。更新我的答案。 – DeeV

1

你有一個NullPointerException異常

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

大概R.id.clickmap是不是你的TextView的findViewById的正確ID被返回null到clickOnMap,則您嘗試將setOnClickListener設置爲空對象。

+0

他會得到一個ClassCastException。 TextView不存在於他的主佈局中。 – DeeV

+0

當您嘗試將對象類型顯式強制轉換爲另一個對象時拋出ClassCastException,即: String a =「hola」; 日曆b =(日曆)a; NullPointerException是當你得到一個未引用的對象。當您要求視圖的ID未在佈局中定義時,FindViewById將返回NULL。 – noni

+0

如果它在View Hierarchy中發現一個View,但您試圖將其轉換爲不是的類,則會拋出ClassCastException。 I.E.,如果R.id.clickmap是一個LinearLayout,則視圖將返回,嘗試轉換爲「TextView」,然後拋出一個「ClassCastException」。 – DeeV

1

如果你想使用findViewByID(),你需要通過它的父視圖引用它。

您應該使用這樣的事情,

TextView clickOnMap = (TextView)ActivityName.this.findViewById(R.id.clickmap); 
+0

不工作....同樣的錯誤 –