Java OnActivityCreated/OnCreateView之外的视图上的NullPointerException

Java OnActivityCreated/OnCreateView之外的视图上的NullPointerException,java,android,android-fragments,tabs,Java,Android,Android Fragments,Tabs,当在OnCreateView方法之外调用任何类型的视图时(或者onactivitycreated方法,我已经尝试了这两种方法),我会得到一个NullPointerException。为了在片段之间进行通信,我使用了接口方法,通过我的研究,这似乎是最好的方法。不幸的是,我怀疑我的错误来自main活动查找片段的方式 为了调试到目前为止我所拥有的东西,我在OnCreateView()/OnActivityCreated()中的对象上使用了System.out.println(),有一个内存地址意味着它

当在
OnCreateView
方法之外调用任何类型的视图时(或者
onactivitycreated
方法,我已经尝试了这两种方法),我会得到一个
NullPointerException
。为了在片段之间进行通信,我使用了接口方法,通过我的研究,这似乎是最好的方法。不幸的是,我怀疑我的错误来自
main活动
查找片段的方式

为了调试到目前为止我所拥有的东西,我在
OnCreateView()/OnActivityCreated()
中的对象上使用了
System.out.println()
,有一个内存地址意味着它存在并且不是空的,但是当我从
MainActivity
在函数外部调用它时,它变为空的

有人能解释一下我的情况吗?谢谢(顺便说一句,我删除了代码中一些无用的部分)

Tab2Home.java

    @Override
public void onActivityCreated (Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);

    spinner = (Spinner)getActivity().findViewById(R.id.tipSpinner);
    adapter = ArrayAdapter.createFromResource(getActivity().getBaseContext(), R.array.tipArray, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

    serviceRate=(RatingBar) getActivity().findViewById(R.id.serviceBar);

    //THE OBJECT BELOW IS WHERE THE NULLPOINTEREXCEPTION IS COMING FROM
    billAmount = (EditText)getActivity().findViewById(R.id.billEditText);
    System.out.println(billAmount); //Surprisingly, this is not null IN the method.

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

}

public void transferInfo(){
    double bill;
    if (String.valueOf(billAmount.getText()).isEmpty()) //billAmount is null OUTSIDE of the method.
        bill = 0.00;
    else
        bill = Double.parseDouble(String.valueOf(billAmount.getText()));
    odsl.setData(       //odsl is the OnDataSetListener object.
            bill,
            Integer.parseInt(String.valueOf(spinner.getItemAtPosition(3))),
            Integer.parseInt(String.valueOf(numPeopleEdit.getText()))
            );
}

public interface OnDataSetListener {
    public void setData(double bill, int tip, int ppl);
}

@Override
public void onAttach(Context context){
    super.onAttach(context);
    try {
        odsl = (OnDataSetListener) context;
    } catch (Exception e){}
}
以及MainActivity.java

    private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);

    mViewPager.setCurrentItem(1);

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            if (position == 2){
                Tab2Home homefrag = (Tab2Home) mSectionsPagerAdapter.getItem(1);
                homefrag.transferInfo();
                System.out.println(".transferInfo() has been called");
            }
        }

        @Override
        public void onPageSelected(int position) {
            if (position == 3){
                Tab2Home homefrag = (Tab2Home) mSectionsPagerAdapter.getItem(2);
                homefrag.transferInfo();
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

}

@Override
public void setData(double bill, int tip, int ppl) {
    Tab3Summary summaryfrag = (Tab3Summary) mSectionsPagerAdapter.getItem(2);
    summaryfrag.updateInfo(bill, tip, ppl);

}
编辑:

以下是错误消息:

05-23 02:28:00.352 31339-31339/com.uottawa.bond.simpletip E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: com.uottawa.bond.simpletip, PID: 31339
                                                                        java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
                                                                            at com.uottawa.bond.simpletip.Tab2Home.transferInfo(Tab2Home.java:97)
                                                                            at com.uottawa.bond.simpletip.MainActivity$1.onPageScrolled(MainActivity.java:64)
                                                                            at android.support.v4.view.ViewPager.dispatchOnPageScrolled(ViewPager.java:1954)
                                                                            at android.support.v4.view.ViewPager.onPageScrolled(ViewPager.java:1928)
                                                                            at android.support.v4.view.ViewPager.pageScrolled(ViewPager.java:1866)
                                                                            at android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1826)
                                                                            at android.view.View.updateDisplayListIfDirty(View.java:16037)
                                                                            at android.view.View.draw(View.java:16834)
                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3764)
                                                                            at android.support.design.widget.CoordinatorLayout.drawChild(CoordinatorLayout.java:1195)
                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3550)
                                                                            at android.view.View.draw(View.java:17071)
                                                                            at android.view.View.updateDisplayListIfDirty(View.java:16050)
                                                                            at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
                                                                            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
                                                                            at android.view.View.updateDisplayListIfDirty(View.java:16013)
                                                                            at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
                                                                            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
                                                                            at android.view.View.updateDisplayListIfDirty(View.java:16013)
                                                                            at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
                                                                            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
                                                                            at android.view.View.updateDisplayListIfDirty(View.java:16013)
                                                                            at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
                                                                            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
                                                                            at android.view.View.updateDisplayListIfDirty(View.java:16013)
                                                                            at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3748)
                                                                            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3728)
                                                                            at android.view.View.updateDisplayListIfDirty(View.java:16013)
                                                                            at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:656)
                                                                            at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:662)
                                                                            at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:770)
                                                                            at android.view.ViewRootImpl.draw(ViewRootImpl.java:2796)
                                                                            at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2604)
                                                                            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2211)
                                                                            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
                                                                            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301)
                                                                            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
                                                                            at android.view.Choreographer.doCallbacks(Choreographer.java:683)
                                                                            at android.view.Choreographer.doFrame(Choreographer.java:619)
                                                                            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
                                                                            at android.os.Handler.handleCallback(Handler.java:751)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                            at android.os.Looper.loop(Looper.java:154)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
找到解决方案:

1.重写以下方法

2.不使用getActivity().findviewbYId,而使用rootView

 @Override
    public void onViewCreated(View rootView, Bundle savedInstanceState) {
    spinner = (Spinner)rootView.findViewById(R.id.tipSpinner);
    adapter = ArrayAdapter.createFromResource(getActivity().getBaseContext(), R.array.tipArray, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

    serviceRate=(RatingBar) rootView.findViewById(R.id.serviceBar);
    billAmount = (EditText)rootView.findViewById(R.id.billEditText);
    System.out.println(billAmount); 
}

你在哪里得到空值?放置stacktrace和布局文件您可以将代码从onActivityCreated移动到onViewCreated,并更改getActivity()。。。要查看.findView…如果您的
微调器
和其他小部件确实属于您的
片段
布局,
getActivity().findView()将返回
null
。相反,使用将它们引用到
onViewCreated()
中,而不使用
getActivity()
。我已经尝试在onViewCreated()中引用它们。我也尝试过将其作为解决方案,但它不起作用。我尝试将其放入onViewCreated()、onCreateView()和onActivityCreated()中,但仍然不起作用。