-2

Ich weiß, das ist sehr allgemeine Frage, aber kann nicht herausfinden, was los ist.bekommen NullPointerException Fehler anzeigen Pager beim Abrufen von Fragment-Methode in Ansicht Pager-Aktivität

Fragment Java-Klasse

// 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 Aktivität

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; 
      } 
     } 


    } 

Warum ich die Nullpointer bin immer da ich die öffentliche Methode des Fragments am Zugriff auf bevor er zum nächsten Fragment gehen. Bevor Sie abstimmen, hinterlassen Sie bitte den Grund der Abstimmung, damit ich die Frage verbessern kann.

EDit:

ich kennen gelernt habe, seit ich die getitem() -Methode das ist nenne, warum alle die Variable des Fragments, das null, warum ich die Nullpointer bin immer. Gibt es eine Möglichkeit, dieses Problem zu lösen?

Antwort

0

sollten Sie Ihre ViewPagerAdapter neu schreiben und speichern Sie die retuened Fragment

ist dies, weil jedes Mal, wenn getItem Funktion call() ein neues Fragment zurück, sondern nur durch die viewpager selbst das Fragment aufgerufen wird oncreateView aufrufen, so dass die zweiten Mal getItem rufen nicht initialisieren systolischen und damit zu Nullpointer führen

Referenz:

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; 
    } 


} 
Verwandte Themen