2011-11-01 10 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 

    } 

} 

私は^^ ... ...かなり私はまだAndroidの開発効率向上の世界ではかなり新しいですhttp://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/から直接取得までそこにこのコードを持っている:/アンドロイドViewPager findViewByIdは働いていない - 常に返すnullの

これで、スピナーコントロールと「ページ」内のいくつかのボタンにアクセスしようとしています。しかし、findViewByIdはnullを返し続けます!

私は、レイアウトについての何かが実際にコードの中に存在しないことを覚えています。まず、instantiateItem()関数で起こっている、膨らんでいなければなりません。そして、それが「ビュー」変数に入ることはかなり明白です。しかし私が電話するとき view.findViewById(R.id.light1_off);

途中でボタンですが、いつもゼロを返しています! 私は、それがロードされている実際のページだったときにだけ呼び出すことさえしました。しかし、私が何をしても、常にnullを返すようになり、厄介なnullpointer例外が発生します。

誰かが私を助けてくれますか?私はかなりアイデアがありません.Googleには何の助けもありません。すでに10種類の検索用語について5ページ目にあります。

答えて

21

この問題で多くの不満と私の髪の毛を引き出した後、私はそれを解決しました!少なくとも私にとっては。私のようにtutsplusのチュートリアルを使用したと仮定すると、あなたの画面に別々のXMLファイルがあります。さて、私はこれらのレイアウトXMLにレイアウトが含まれていると仮定します(LinearLayout、RelativeLayoutなど)。これらのレイアウトには、ボタンやその他のウィジェットが含まれています。あなたがfindViewByIdにできるようにしなければならないことは、この方法であなたのボタンを初期化し、instatiateItem方法の実際のswitch文では、次のとおりです。

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

私たちは実際にメインアクティビティからボタンにアクセスしますか? –

0

膨らんだ状態でxmlを表示しないようにしてください。あなたは+ @ idを使用しますか?もしそれを試してみてください。

0

あなただけfindViewById

関連する問題