2017-02-12 3 views
0

Мне нужны мои фрагменты, чтобы всегда вызывать определенную функцию, когда они являются активным фрагментом. Я использую ViewPager, поэтому согласно this siteФрагмент onResume() получил nullpointer при использовании FragmentPagerAdapter

создать класс интерфейса под названием FragmentLifecycle.java:

public interface FragmentLifecycle { 

public void onResumeFragment(); 

} 

и я Реализован этот интерфейс для моего фрагмента:

@Override 
public void onResumeFragment() { 
    Log.i(TAG, "onResumeFragment() running"); 
    Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show(); 
} 

и в моей деятельности:

 vpPager = (ViewPager) findViewById(R.id.vpg_main_content); 
    adapterFragment = new PagerAdapterFragment(getSupportFragmentManager()); 

    vpPager.setAdapter(adapterFragment); 


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

     @Override 
     public void onPageSelected(int newPosition) { 
      Toast.makeText(ProfileActivity.this, "Selected page position: " + newPosition, Toast.LENGTH_SHORT).show(); 
      if (newPosition == 0) { 
       FragmentLifecycle fragmentToHide = (FragmentLifecycle) adapterFragment.getItem(0); 
       fragmentToHide.onResumeFragment(); 
      } 

     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 
} 

мой адаптер фрагмента:

@Override 
public Fragment getItem(int position) { 
    switch (position) { 
     case 0: // Fragment # 0 - This will show FirstFragment 
      return ProfileFragment.newInstance(0, "Profile"); 
     case 1: // Fragment # 0 - This will show FirstFragment different title 
      return EditProfileFragment.newInstance(1, "Edit"); 
     default: 
      return null; 
    } 
} 

Когда я запускаю мое приложение, которое я получил Null указатель:

           java.lang.NullPointerException 
                        at android.widget.Toast.<init>(Toast.java:93) 
                        at android.widget.Toast.makeText(Toast.java:241) 
                        at com.example.sayres.myapplication7.mvp.view.profile.ProfileFragment.onResumeFragment(ProfileFragment.java:117) 
                        at com.example.sayres.myapplication7.mvp.view.profile.ProfileActivity$1.onPageSelected(ProfileActivity.java:56) 
                        at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1862) 
                        at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:625) 
                        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:609) 
                        at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2176) 
                        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 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 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:3947) 
                        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826) 
                        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392) 
                        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442) 
                        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411) 
                        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3518) 
                        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419) 
                        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3575) 
                        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392) 
                        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442) 
                        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411) 
                        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419) 
                        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392) 
                        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5532) 
                        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5512) 
                        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5483) 
                        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5612) 
                        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:5001) 
                        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:785) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
                        at dalvik.system.NativeStart.main(Native Method) 

я получил ошибку в этой строке Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show(); на моем fragment.What в вашей идее?

+0

проверки, если getActivity является недействительным!? – rafsanahmad007

+1

убедитесь, что ваш фрагмент прикреплен первым. –

+0

добавить фрагмент затем вызвать onResumeFragment() вашего интерфейса – Aryan

ответ

0

Вы получаете это исключение, потому что активность еще не прикреплен к фрагменту, когда вы звоните fragmentToHide.onResumeFragment() в вашем обратном вызове onPageSelected().

Вместо этого переопределите setUserVisibleHint(boolean isVisibleToUser), чтобы определить, является ли фрагмент видимым для пользователя или нет.

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    // Your onResumeFragment() code here. 
    if (isVisibleToUser) { 
     Log.i(TAG, "onResumeFragment() running"); 
     Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show(); 
    } 
} 

Смотрите этот вопрос для дальнейшего по этому вопросу: How to determine when Fragment becomes visible in ViewPager

0

попробовать это в вашем фрагменте:

protected Activity mActivity; 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    mActivity = activity; 
} 

Теперь использовать это в Toast как:

if (isAdded()) { 
    Toast.makeText(mActivity, "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show(); 
} 
+0

У меня есть один метод Attach. когда я добавляю вам код, я получил это: 'onAttach (android.app.Activity) устарел' –

+0

также я получил ту же ошибку.null pointer –