在视图寻呼机中获取片段方法时获取NullPointerException错误视图寻呼机活动

时间:2017-02-21 17:23:06

标签: java android android-fragments nullpointerexception android-viewpager

我知道这是一个非常普遍的问题,但无法弄清楚出了什么问题。

Fragment java class

// 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。有什么方法可以解决这个问题。

1 个答案:

答案 0 :(得分:0)

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

这是因为每次调用getItem()函数都会返回一个新片段,但只有viewpager本身调用该片段才会调用oncreateView,所以第二次调用getItem时没有初始化收缩 strong>因此导致 NUllPointerException

供参考:

<link href="https://cdnjs.cloudflare.com/ajax/libs/angular-material/1.1.3/angular-material.min.css" rel="stylesheet">

<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-animate.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-aria.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-messages.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-material/1.1.3/angular-material.min.js"></script>

<div ng-app='test' ng-controller='TestController'>
  <div ng-repeat='x in items'>
    <div>Name: {{x.Name}}</div>
    <div>
      <md-select ng-model='x.Address' aria-label='address'>
        <md-option ng-value='address.description' ng-repeat='address in AddressData'>{{address.description}}</md-option>
      </md-select>
    </div>
  </div>
</div>