2011-11-01 2 views
8
public class HSPTabletTestActivity extends Activity { 
private class MyPagerAdapter extends PagerAdapter { 

    public int getCount() { 
     return 2; 
    } 

    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 = R.layout.lighttab; 
      break; 
     case 1: 
      resId = R.layout.securitytab; 
      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 

    } 

} 

나는 ^^ ... 아주 많이 ... 나는 아직도 안드로이드 developement에의 세계에서 아주 새로운 해요 http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/에서 직접 촬영까지가이 코드를 가지고 :/안드로이드 ViewPager findViewById를 작동하지 않습니다 - 항상 반환 널

이제 '회 전자 컨트롤'과 '페이지'내의 일부 버튼에 액세스하려고합니다. 하지만 findViewById는 null을 반환합니다!

레이아웃에 관한 내용이 실제로 코드 안에 존재하지 않으며 instantiateItem() 함수에서 먼저 발생되는 것과 같이 팽창되어야한다는 것을 기억합니다. 그리고 그것은 "view"변수로 들어가는 것이 꽤 분명합니다. 하지만 전화 할 때 view.findViewById (R.id.light1_off);

도중에 버튼이되어, 항상 제로가 돌아오고 있습니다! 실제로로드 된 페이지 일 때만 호출했는지 확인했습니다. 하지만 내가 한 일이 무엇이든, 항상 null을 반환하고 나쁘게 nullpointer 예외가 발생합니다.

누군가 나를 도와 줄 수 있습니까? 나는 아이디어가별로 없으며 Google은 도움이되지 않는다. 이미 약 10 가지 검색 용어로 5 페이지를 읽었다.

답변

21

이 문제에 대해 많은 좌절감과 내 머리카락을 끌어 낸 후 해결했습니다! 적어도 나에게는. 필자가했던 것처럼 tutsplus 튜토리얼을 사용했다고 가정하면 화면에 별도의 XML 파일이 있습니다. 이제 레이아웃 XML에 레이아웃 XML이 있다고 가정합니다 (즉, LinearLayout, RelativeLayout 등). 이제 이러한 레이아웃에는 버튼과 다른 위젯이 포함됩니다. 당신이해야하는 것은의 instatiateItem 방법의 실제 스위치 문에서, 이런 방식으로 버튼을 초기화한다 findViewById를 할 수 있도록 할 :

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 = R.layout.lighttab; 
     View view = inflater.inflate(resId, null); 
     RelativeLayout layout=(RelativeLayout)view.findViewById(R.id.relLayout); 
     Button button=(Button)layout.findViewById(R.id.button); 
     ((ViewPager) collection).addView(view, 0); 
     return view; 
    case 1: 
     resId = R.layout.securitytab; 
     ... 
     ... 
     return view; 
    } 
} 

그래서 ... 먼저 뷰를 팽창이 다음 초기화 레이아웃 유형 (RelativeLayout)을 캐스팅하고 .findViewById (resource id)를 호출하여 뷰 내에서 레이아웃을 유지합니다. 그런 다음 위젯 유형 (Button)을 캐스팅하고 .findViewById (resource id)를 호출하여 찾고있는 실제 위젯을 초기화합니다.

이것은 나를 위해 일 했으므로이 방법으로 문제가 해결되기를 바랍니다. 알아 내서 영원히 생각났다.

+4

좋은 일을이 모든 더러운 작업 만 추가 된 setContentView (R.layout.youlayout)을 방지 할 수 있습니다! 이것은 정말 실망스런 문제였습니다. – Jackson

+1

정말 환상적입니다! 감사합니다. – swati

+2

어떻게 주요 활동에서 실제로 Button에 액세스합니까? –

0

xml을 비정상적으로 표시하지 않으므로 추측하십시오. + @ id를 사용하십니까? 시도하지 않으면.

0

당신은 findViewById를하기 전에

관련 문제