2013-11-01 4 views
-1

Когда я меняю ориентацию и прокручиваю, он падает. Это мой журнал котgetActivity() return null in Fragment

11-01 11:21:19.715: E/AndroidRuntime(4336): FATAL EXCEPTION: main 
11-01 11:21:19.715: E/AndroidRuntime(4336): java.lang.NullPointerException 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at com.example.saisuke.CalendarAdapter.<init>(CalendarAdapter.java:33) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at com.example.saisuke.MonthFragment.updateCurrentMonth(MonthFragment.java:161) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at com.example.saisuke.MonthFragment.onNextMonth(MonthFragment.java:177) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at com.example.saisuke.Saisuke$1.onPageScrollStateChanged(Saisuke.java:107) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at android.support.v4.view.ViewPager.setScrollState(ViewPager.java:398) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at android.support.v4.view.ViewPager.access$000(ViewPager.java:84) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at android.support.v4.view.ViewPager$3.run(ViewPager.java:243) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at android.view.Choreographer.doFrame(Choreographer.java:524) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at android.os.Handler.handleCallback(Handler.java:615) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at android.os.Handler.dispatchMessage(Handler.java:92) 11-01 
11:21:19.715: E/AndroidRuntime(4336): at android.os.Looper.loop(Looper.java:137) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at android.app.ActivityThread.main(ActivityThread.java:4898) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at java.lang.reflect.Method.invoke(Method.java:511) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
11-01 11:21:19.715: E/AndroidRuntime(4336):  at dalvik.system.NativeStart.main(Native Method) 

MainActivity.java

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_saisuke); 
     ((Global) this.getApplication()).setStraightMode(false); 
     mOldState = ((Global) this.getApplication()).getStraightMode(); 
     monthList = new ArrayList<MonthFragment>(3); 
     curMonth = Calendar.getInstance(); 
     Calendar prevMonth, nextMonth; 
     prevMonth = (Calendar) curMonth.clone(); 
     nextMonth = (Calendar) curMonth.clone(); 
     prevMonth.set(Calendar.MONTH, prevMonth.get(Calendar.MONTH) - 1); 
     nextMonth.set(Calendar.MONTH, nextMonth.get(Calendar.MONTH) + 1); 
      monthList.add(MonthFragment.newInstance(prevMonth)); 
      monthList.add(MonthFragment.newInstance(curMonth)); 
      monthList.add(MonthFragment.newInstance(nextMonth)); 
     //tmpCurMonth = monthList[1].getCurCalendar(); 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), monthList); 
     mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrollStateChanged(int arg0) { 
       // TODO Auto-generated method stub 
       if (arg0 == ViewPager.SCROLL_STATE_IDLE) { 
        if (mSelectedPageIndex < PAGE_MIDDLE) { 
         monthList.get(0).onPreviousMonth(); 
         monthList.get(1).onPreviousMonth(); 
         monthList.get(2).onPreviousMonth(); 
        } else if (mSelectedPageIndex > PAGE_MIDDLE) { 
         monthList.get(0).onNextMonth(); 
         monthList.get(1).onNextMonth(); 
         monthList.get(2).onNextMonth(); 
        } 
        mViewPager.setCurrentItem(1, false); 
        //tmpCurMonth = monthList[1].getCurCalendar(); 
        mSectionsPagerAdapter.notifyDataSetChanged(); 
       } 
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
       // TODO Auto-generated method stub 
       if (((Global) getApplication()).getStraightMode() != mOldState){ 
        mOldState = ((Global) getApplication()).getStraightMode(); 
        mSectionsPagerAdapter.notifyDataSetChanged(); 
       } 
      } 

      @Override 
      public void onPageSelected(int arg0) { 
       // TODO Auto-generated method stub 
       mSelectedPageIndex = arg0; 
      } 
     }); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 
     mViewPager.setCurrentItem(1, false); 
    } 

MyFragent.java

static MonthFragment newInstance(Calendar a) { 
     MonthFragment f = new MonthFragment(a); 
     return f;  
    } 

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     if (savedInstanceState != null) { 
      // Restore last state 
      calendar = (Calendar) savedInstanceState.getSerializable("starttime"); 
     } 

     mMainView = inflater.inflate(R.layout.fragment_saisuke, container, false); 
     adap = new CalendarAdapter(getActivity(), calendar); 
     ....   
     return mMainView; 
    } 

protected void updateCurrentMonth() { 
     adap.updateData(); 
    } 

protected final void onNextMonth() { 
     if (calendar.get(Calendar.MONTH) == Calendar.DECEMBER) { 
      calendar.set((calendar.get(Calendar.YEAR) + 1), Calendar.JANUARY, 1); 
     } else { 
      calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1); 
     } 
     updateCurrentMonth(); 
    } 
+0

Что такое строка 33 'CalendarAdapter.java'? 'getActivity()' не равно null. ваш «календарь» может мне недействительным – Raghunandan

+0

@Raghunandan: календарь не равен нулю. Строка 33 - это mInflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); Потому что getActivity() получает значение null, поэтому контекст имеет значение null – lolyoshi

+0

, если он находится в фрагменте пользователя 'getActivity()' вместо 'context' и отправляет эту часть вашего кода. – Raghunandan

ответ

-4

я, наконец, узнал, как исправить для моей ошибки Это довольно просто. Мне просто нужно переопределить функцию onSaveInstanceState в действии и опустить super.onSaveInstanceState (outState); Похоже, что

@Override 
protected void onSaveInstanceState(final Bundle outState) {   
    //super.onSaveInstanceState(outState); 
} 
+3

Нет Нет Нет ... это плохо :) Не надо. Действительно плохо. Активность имеет жизненный цикл и делает то, о чем вам не нужно беспокоиться.Это происходит при вызове методов. Если вы переопределите метод и вы пропустите супервызов, вы фактически не позволяете активности выполнять свою внутреннюю работу. –

+1

@ MartínMarconcini: Однако это работает для меня. Он решил мою ошибку – lolyoshi

+1

Вы понимаете, почему она решила вашу ошибку? –

5

Ваше собственное решение крайне не рекомендуется, и вы никогда не должны пропустить вызов супер() в методах жизненного цикла.

Вместо этого выясните, где ваша проблема.

Советы, чтобы сделать это:

  1. Override (и называют супер!) Каждый активность/Fragment метод жизненного цикла. OnCreate, OnResume, OnPause, OnStop, OnCreateView, OnViewCreated, Etc ...

  2. Добавьте строку LOG для каждого и запустите приложение. Посмотрите, какие из них вызываются и в каком порядке.

  3. Вращайте устройство. Сравните результаты.

  4. Узнайте, почему переменная вашего члена не инициализирована, учитывая тот факт, что при ротации действия уничтожены и воссозданы.

  5. Будьте счастливы, если не используете ужасно плохой взлом и тот факт, что ваше приложение для Android не будет таинственным крахом.

+0

Моя проблема, возможно, схожая с этим. Если у вас есть другая идея. Вы можете показать мне, потому что я не могу найти другие способы его решения. http://stackoverflow.com/questions/13910826/viewpager-fragmentstatepageradapter-orientation-change – lolyoshi

Смежные вопросы