【问题标题】:NullPointerException on views outside of OnActivityCreated/OnCreateView在 OnActivityCreated/OnCreateView 之外的视图上出现 NullPointerException
【发布时间】:2017-05-23 04:47:21
【问题描述】:

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

为了尝试调试我目前所拥有的,我在OnCreateView()/OnActivityCreated() 中的对象上使用了System.out.println(),并且有一个内存地址意味着它存在并且不为空,但是当我在函数之外从@ 调用它时987654327@,变成null了……?

有人可以了解我的情况吗?谢谢! (顺便说一句,我已经去掉了一些无用的代码部分)

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)

【问题讨论】:

  • 你在哪里得到 null ?把你的堆栈跟踪和你的布局文件
  • 您可以将代码从 onActivityCreated 移动到 onViewCreated 并将 getActivity().findVi... 更改为 view.findView...。
  • 如果您的spinner 和其他小部件确实属于您的fragment 布局,getActivity().findViewById() 将返回null。而是将它们引用到onViewCreated() 而不使用getActivity()
  • 我已经尝试在 onViewCreated() 中引用它们了。

标签: java android android-fragments tabs


【解决方案1】:

找到解决方案:

1.覆盖下面的方法

2.使用 rootView

代替 getActivity().findviewbYId
 @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); 
}

【讨论】:

  • 我也尝试过将其作为解决方案,但它不起作用。我尝试将它放入 onViewCreated()、onCreateView() 和 onActivityCreated() 中,但它仍然不起作用。
猜你喜欢
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 2011-12-23
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
相关资源
最近更新 更多