有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android视图是片段内部的空对象引用

我对一些代码很难理解。我使用2个片段的滑动标签。在我的一个片段中,我试图得到一个LinearLayout并在其中添加一些东西,但每次我尝试做getView().findViewByID()时,我都得到了空对象引用

我在onCreateView()之后调用该函数。我尝试创建一个View类型的变量,并将我膨胀的视图放在onCreateView中,但我一直得到相同的错误。我还尝试在视图前放置一个if()来检查视图是否为null,但即使这样,我也得到了null对象引用。有人能帮我吗

public class listAlarmFragment extends Fragment{

  public View view = null;
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup vg, Bundle bundle){
     View v = inflater.inflate(R.layout.list_alarm,vg,false);
     view = v;
     return v;
  }


   public void showAlarm(Cursor c){
     if(view != null) { //even with that check, I got a null pointer exception
        LinearLayout baseList = (LinearLayout) view.findViewById(R.id.baseList); // NullPointerException: Attempt to invoke virtual method on a null object reference
      }
   }
 }

用getView()替换视图不会改变任何事情。 这就是我从主活动调用函数的方式

   pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
        Fragment c = adapter.getItem(0);
         ((listAlarmFragment)(c)).showAlarm(dbHelper.getAlarm()); // where I call the function
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

当我的应用程序打开时,我正在beggining打开这个片段。当我试图切换到另一个片段时,它崩溃了

以下是堆栈跟踪:

04-02 18:41:54.615 31584-31584/al.demo.alarmmanagerdemo E/AndroidRuntime: FATAL EXCEPTION: main
                                                                      Process: al.demo.alarmmanagerdemo, PID: 31584
                                                                      java.lang.NullPointerException: Attempt to invoke virtual method '安卓.view.View 安卓.view.View.findViewById(int)' on a null object reference
                                                                          at al.demo.alarmmanagerdemo.fragment.listAlarmFragment.showAlarm(listAlarmFragment.java:83)
                                                                          at al.demo.alarmmanagerdemo.MainActivity$1.onPageSelected(MainActivity.java:54)
                                                                          at 安卓.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1971)
                                                                          at 安卓.support.v4.view.ViewPager.scrollToItem(ViewPager.java:689)
                                                                          at 安卓.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:673)
                                                                          at 安卓.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2288)
                                                                          at 安卓.view.View.dispatchTouchEvent(View.java:10779)
                                                                          at 安卓.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2858)
                                                                          at 安卓.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2534)
                                                                          at 安卓.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2864)
                                                                          at 安卓.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2549)
                                                                          at 安卓.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2864)
                                                                          at 安卓.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2549)
                                                                          at 安卓.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2864)
                                                                          at 安卓.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2549)
                                                                          at 安卓.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2864)
                                                                          at 安卓.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2549)
                                                                          at 安卓.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2864)
                                                                          at 安卓.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2549)
                                                                          at 安卓.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2864)
                                                                          at 安卓.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2549)
                                                                          at com.安卓.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:605)
                                                                          at com.安卓.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1895)
                                                                          at 安卓.app.Activity.dispatchTouchEvent(Activity.java:3241)
                                                                          at 安卓.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:67)
                                                                          at 安卓.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:67)
                                                                          at com.安卓.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:567)
                                                                          at 安卓.view.View.dispatchPointerEvent(View.java:11008)
                                                                          at 安卓.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5155)
                                                                          at 安卓.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5007)
                                                                          at 安卓.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4532)
                                                                          at 安卓.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4585)
                                                                          at 安卓.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4551)
                                                                          at 安卓.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4684)
                                                                          at 安卓.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4559)
                                                                          at 安卓.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4741)
                                                                          at 安卓.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4532)
                                                                          at 安卓.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4585)
                                                                          at 安卓.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4551)
                                                                          at 安卓.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4559)
                                                                          at 安卓.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4532)
                                                                          at 安卓.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7092)
                                                                          at 安卓.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7024)
                                                                          at 安卓.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6985)
                                                                          at 安卓.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7202)
                                                                          at 安卓.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                                                                          at 安卓.os.MessageQueue.nativePollOnce(Native Method)
                                                                          at 安卓.os.MessageQueue.next(MessageQueue.java:323)
                                                                          at 安卓.os.Looper.loop(Looper.java:136)
                                                                          at 安卓.app.ActivityThread.main(ActivityThread.java:6776)
04-02 18:41:54.615 31584-31584/al.demo.alarmmanagerdemo E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
                                                                          at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1510)
                                                                          at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:1400)

共 (1) 个答案

  1. # 1 楼答案

    我会这样做

    public class listAlarmFragment extends Fragment{
    
      //public View view = null; // no need
      private LinearLayout baseList; 
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup vg, Bundle bundle){
         View v = inflater.inflate(R.layout.list_alarm,vg,false);
         baseList = (LinearLayout) v.findViewById(R.id.baseList);
         //view = v; no need
         return v;
      }
    
    
       public void showAlarm(Cursor c){
         if(baseList!=null){
         //do something with your baseList 
         }
       }
     }
    

    同时检查布局xml R.layout中是否存在R.id.baseList。列出你的警报。 它应该是直线布局的

    id=@+id/baseList