Android 访问视图分页器中片段外部的片段变量

Android 访问视图分页器中片段外部的片段变量,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,在阅读问题之前,请参考图片 我正在使用viewpager显示片段 问题 在片段中,我使用了两个edittext,比如说editText1,editText2现在的问题是如何获取edittext数据。我只能在用户单击next按钮时获取editText值,但next按钮在fragment之外。如何访问片段外部的editText 在否决该问题之前,请让我知道原因,以便改进我的问题 片段java类 // newInstance constructor for creating fragment with

在阅读问题之前,请参考图片

我正在使用viewpager显示片段

问题

在片段中,我使用了两个edittext,比如说editText1,editText2现在的问题是如何获取edittext数据。我只能在用户单击next按钮时获取editText值,但next按钮在fragment之外。如何访问片段外部的editText

在否决该问题之前,请让我知道原因,以便改进我的问题

片段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);
        }


        // 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);

        Fragment fragment=adapterViewPager.getItem(prevPage);

        if (fragment.getClass().equals(BpDetails.class)){
            Log.i("Call ","Yes");
        }

        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 prevFragment=adapterViewPager.getItem(prevPage);


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


    }
vpPager=(ViewPager)findviewbyd(R.id.view\u pager);
AdapterViewPage=新的MyPagerAdapter(getSupportFragmentManager());
设置适配器(AdapterViewPage);
Fragment Fragment=adapterViewPager.getItem(prevPage);
if(fragment.getClass().equals(BpDetails.class)){
Log.i(“呼叫”、“是”);
}
findviewbyd(R.id.btn_prev).setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
//检查最后一页
//如果最后一页主页将启动
int current=getItem(-1);
如果(当前!=0)
prevPage=current-1;
如果(电流<4){
//移到下一屏幕
vpPager.setCurrentItem(当前);
}否则{
//最终达成协议。
}
}
});
findviewbyd(R.id.btn_next).setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//检查最后一页
//如果最后一页主页将启动
int current=getItem(+1);
如果(当前!=0)
prevPage=current-1;
系统输出打印项次(“上一页”+上一页);
如果(电流<4){
//移到下一屏幕
Fragment prevFragment=adapterViewPager.getItem(prevPage);
}否则{
//最终达成协议。
}
}
});
}
私有整数getItem(整数i){
返回vpPager.getCurrentItem()+i;
}
公共静态类MyPagerAdapter扩展了FragmentPagerAdapter{
私有静态int NUM_ITEMS=4;
私有静态int-mSelectedPosition;
公共MyPagerAdapter(碎片管理器碎片管理器){
超级(碎片管理器);
//mSelectedPosition=selectedPosition;
}
//返回总页数
@凌驾
public int getCount(){
返回NUM_项;
}
//返回要为该页显示的片段
@凌驾
公共片段getItem(int位置){
开关(位置){
案例0://Fragment#0-这将显示FirstFragment
返回基本细节。newInstance(0);
案例1:
返回BpDetails.newInstance(1);
案例2:
返回BslDetails.newInstance(2);
案例3:
返回摘要newInstance(3);
违约:
返回null;
}
}
}

像这样在片段中创建两个getter

public String getSystolic(){

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

    }

public String getDiastolic(){

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



     BpDetails fr = (BpDetails)myAdapter.getItem(myViewPager.getCurrentItem());
     String systolicString = fr.getSystolic();

像这样在片段中创建两个getter

public String getSystolic(){

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

    }

public String getDiastolic(){

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



     BpDetails fr = (BpDetails)myAdapter.getItem(myViewPager.getCurrentItem());
     String systolicString = fr.getSystolic();

我也有类似的问题
.getItem()
实例化一个新的
片段
,因此在调用
myAdapter.getItem(…)
时,
片段
中的所有元素都将为null,而
片段
则不为null

当我修复这个问题时,我要做的是在
MyPagerAdapter
中创建另一个名为
getInstancedFragment
的方法:

public Fragment getInstantiatedFragment(int position)
    {
        return fragments.get(position);
    }
fragments
是类的新字段:

private ArrayList<Fragment> fragments = new ArrayList<>();
如果要在返回之前将片段添加到
片段
,则调用:

BpDetails fr = (BpDetails)myAdapter.getInstantiatedItem(myViewPager.getCurrentItem());
获取所创建片段的实例,然后调用

String systolicString=fr.getSystolic()

如果您使用的是上一个答案的方法


这样您就可以跟踪
片段中的实例化片段。我相信还有更好的办法。

我也遇到过类似的问题
.getItem()
实例化一个新的
片段
,因此在调用
myAdapter.getItem(…)
时,
片段
中的所有元素都将为null,而
片段
则不为null

当我修复这个问题时,我要做的是在
MyPagerAdapter
中创建另一个名为
getInstancedFragment
的方法:

public Fragment getInstantiatedFragment(int position)
    {
        return fragments.get(position);
    }
fragments
是类的新字段:

private ArrayList<Fragment> fragments = new ArrayList<>();
如果要在返回之前将片段添加到
片段
,则调用:

BpDetails fr = (BpDetails)myAdapter.getInstantiatedItem(myViewPager.getCurrentItem());
获取所创建片段的实例,然后调用

String systolicString=fr.getSystolic()

如果您使用的是上一个答案的方法


这样您就可以跟踪
片段中的实例化片段。我相信还有更好的办法。

^。你是如何实现
ViewPager
@an_droid_dev共享代码的。@JoshLaird我已经共享了代码。^。您是如何实现
ViewPager
@an_droid_dev共享代码的。@JoshLaird我已经共享了代码。java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.text.Editable android.widget.EditText.getText()”。这是我遇到的错误。我正在调用BpDetails fr=(BpDetails)myAdapter.getItem(myViewPager.getCurrentItem());字符串systolicString=fr.getSystolic();单击“下一步”按钮时,@AnkurKhandelwal在onCreateView方法或日志中放置一个断点,然后查看i