继承Fragment时出现奇怪的null引用异常

时间:2014-06-03 06:44:26

标签: android inheritance android-fragments

我有一个不同片段的应用。每个片段都是一个计算器。要创建最后一个(PointsPlusCalculatorFragment),我从另一个片段继承了它,并且我覆盖了已更改的方法。我认为这应该可行,但是在ViewPager中切换视图时我得到空引用异常。可以找到该应用的源代码here

为什么会这样?

这是logcat错误:

06-03 12:43:34.900      877-877/cat.company.ppcalc E/MessageQueue-JNI﹕ java.lang.NullPointerException
        at cat.company.ppcalc.fragments.ProPointsCalculatorFragment.SetUnits(ProPointsCalculatorFragment.java:86)
        at cat.company.ppcalc.fragments.ProPointsCalculatorFragment.onSharedPreferenceChanged(ProPointsCalculatorFragment.java:190)
        at android.app.SharedPreferencesImpl$EditorImpl.notifyListeners(SharedPreferencesImpl.java:475)
        at android.app.SharedPreferencesImpl$EditorImpl.commit(SharedPreferencesImpl.java:461)
        at cat.company.ppcalc.MainActivity$2.onPageSelected(MainActivity.java:111)
        at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:567)
        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:551)
        at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2015)
        at android.view.View.dispatchTouchEvent(View.java:7706)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
        at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
        at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
        at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.dispatchTouchEvent(ActionBarActivityDelegateICS.java:268)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
        at android.view.View.dispatchPointerEvent(View.java:7886)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3954)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3833)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5602)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5582)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5553)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5682)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:138)
        at android.os.Looper.loop(Looper.java:123)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at co
06-03 12:43:34.910      877-877/cat.company.ppcalc E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: cat.company.ppcalc, PID: 877
java.lang.NullPointerException
        at cat.company.ppcalc.fragments.ProPointsCalculatorFragment.SetUnits(ProPointsCalculatorFragment.java:86)
        at cat.company.ppcalc.fragments.ProPointsCalculatorFragment.onSharedPreferenceChanged(ProPointsCalculatorFragment.java:190)
        at android.app.SharedPreferencesImpl$EditorImpl.notifyListeners(SharedPreferencesImpl.java:475)
        at android.app.SharedPreferencesImpl$EditorImpl.commit(SharedPreferencesImpl.java:461)
        at cat.company.ppcalc.MainActivity$2.onPageSelected(MainActivity.java:111)
        at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:567)
        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:551)
        at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2015)
        at android.view.View.dispatchTouchEvent(View.java:7706)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
        at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
        at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
        at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.dispatchTouchEvent(ActionBarActivityDelegateICS.java:268)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
        at android.view.View.dispatchPointerEvent(View.java:7886)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3954)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3833)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5602)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5582)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5553)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5682)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:138)
        at android.os.Looper.loop(Looper.java:123)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.Zygo

这是给出错误的行:

private void SetUnits(View view) {
    String unit= PreferenceManager.getDefaultSharedPreferences(getActivity()).getString("selected_unit","grams");
    String[] unitsValues=getResources().getStringArray(R.array.unitsValues);
    String[] units=getResources().getStringArray(R.array.units);
    int index= Arrays.asList(unitsValues).indexOf(unit);
    String unitName=units[index];
    -- This line -- TextView carbsView = (TextView) view.findViewById(R.id.unitCarbs);
    carbsView.setText(unitName);
    TextView fatView=(TextView) view.findViewById(R.id.unitFat);
    fatView.setText(unitName);
    TextView fibreView=(TextView) view.findViewById(R.id.unitFibre);
    fibreView.setText(unitName);
    TextView proteinView=(TextView) view.findViewById(R.id.unitProtein);
    proteinView.setText(unitName);
    TextView portionView=(TextView) view.findViewById(R.id.unitPortion);
    portionView.setText(unitName);
}

这两个片段使用相同的布局文件。

1 个答案:

答案 0 :(得分:1)

请确保膨胀的View不是空的。 (View view)

private void SetUnits(View view)

确保也传递了膨胀的视图。