-2

我知道这是非常普遍的问题,但无法弄清楚什么是错误的。获取NullPointerException错误视图寻呼机,同时在视图寻呼机中获取片段方法活动

片段Java类

// newInstance constructor for creating fragment with arguments 
     public static BpDetails newInstance(int page) { 
      BpDetails fragmentFirst = new BpDetails(); 
      Bundle args = new Bundle(); 
      args.putInt("someInt", page); 
      fragmentFirst.setArguments(args); 
      return fragmentFirst; 
     } 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      page = getArguments().getInt("someInt", 0); 
     } 

     public String getSystolic(){ 

      return this.systolic.getText().toString(); 

     } 

    /* public String getDiastolic(){ 

     return this.diastolic.getText().toString(); 
     }*/ 


    // Inflate the view for the fragment based on layout XML 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      final View view = inflater.inflate(R.layout.bp_details, container, false); 

      Log.i("View ",view.toString()); 

      Log.i("DOB is ",Long.toString(Constants.dob)); 


      systolic =(EditText) view.findViewById(R.id.systolic); 
      diastolic =(EditText) view.findViewById(R.id.diastolic); 


      return view; 
     } 

ViewPager活动

vpPager = (ViewPager) findViewById(R.id.view_pager); 

     adapterViewPager = new MyPagerAdapter(getSupportFragmentManager()); 
     vpPager.setAdapter(adapterViewPager); 


     findViewById(R.id.btn_prev).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       // checking for last page 
       // if last page home screen will be launched 
       int current = getItem(-1); 
       if (current!=0) 
        prevPage=current-1; 
       if (current < 4) { 
        // move to next screen 
        vpPager.setCurrentItem(current); 
       } else { 
        //final reached. 
       } 

      } 
     }); 

     findViewById(R.id.btn_next).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // checking for last page 
       // if last page home screen will be launched 
       int current = getItem(+1); 

       if (current!=0) 
        prevPage=current-1; 

       System.out.println("Prev page "+prevPage); 

       if (current < 4) { 
        // move to next screen 
Fragment bpFragment=adapterViewPager.getItem(vpPager.getCurrentItem()); 

        if (bpFragment instanceof BpDetails){ 

         System.out.println("Current item is "+vpPager.getCurrentItem()); 

         BpDetails fr = (BpDetails)adapterViewPager.getItem(vpPager.getCurrentItem()); 

         **String systolicString = fr.getSystolic();** //error point 

         Log.i("Systolic is ",systolicString); 
        } 


       } else { 

        //final reached. 
       } 
      } 
     }); 


    } 

    private int getItem(int i) { 
     return vpPager.getCurrentItem() + i; 
    } 


    public static class MyPagerAdapter extends FragmentPagerAdapter { 
     private static int NUM_ITEMS = 4; 
     private static int mSelectedPosition; 

     public MyPagerAdapter(FragmentManager fragmentManager) { 
      super(fragmentManager); 
      //mSelectedPosition=selectedPosition; 
     } 

     // Returns total number of pages 
     @Override 
     public int getCount() { 
      return NUM_ITEMS; 
     } 

     // Returns the fragment to display for that page 
     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: // Fragment # 0 - This will show FirstFragment 
        return BasicDetails.newInstance(0); 
       case 1: 
        return BpDetails.newInstance(1); 
       case 2: 
        return BslDetails.newInstance(2); 
       case 3: 
        return Summary.newInstance(3); 

       default: 
        return null; 
      } 
     } 


    } 

为什么我收到NullPointerException异常,因为我访问片段的方法,公众才去到下一个片段。 投票前请留下投票原因,以便我可以改进问题。

编辑:

我才知道,因为我调用的GetItem()方法,这就是为什么片段的所有的变量设置为null就是为什么我收到NullPointerException异常。有什么办法可以解决这个问题吗?

回答

0

你应该重写你的ViewPagerAdapter和存储retuened片段

这是因为每次你调用getItem()时间函数返回一个新的片段,而只能由viewpager本身的片段将调用oncreateView调用,所以你调用getItem没有初始化收缩,因此第二次导致NullPointerException异常

供参考:

public static class MyPagerAdapter extends FragmentPagerAdapter { 
    private static int NUM_ITEMS = 4; 
    private static int mSelectedPosition; 
    Map<Integer,Fragment> map= new HashMap<>(); 

    public MyPagerAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 
     //mSelectedPosition=selectedPosition; 
    } 

    // Returns total number of pages 
    @Override 
    public int getCount() { 
     return NUM_ITEMS; 
    } 

    // Returns the fragment to display for that page 
    @Override 
    public Fragment getItem(int position) { 

     Fragment f = map.get(position) 
     if(f!=null){ 
      return f; 
     } 
     switch (position) { 

      case 0: // Fragment # 0 - This will show FirstFragment 
       f = BasicDetails.newInstance(0); 
      case 1: 
       f = return BpDetails.newInstance(1); 
      case 2: 
       f = return BslDetails.newInstance(2); 
      case 3: 
       f = return Summary.newInstance(3); 

      default: 
       return null; 
     } 

     map.put(postion,f); 
     return f; 
    } 


} 
相关问题