0

I found the exception is because called super.onResume() in onResume(),the exception detail is :

07-08 10:10:00.483  26883-26883/E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.xxx.xxx, PID: 26883
    java.lang.RuntimeException: Unable to resume activity {com.xxx.xxx/com.xxx.xxx.MainActivity}: java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2986)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3017)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2392)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:714)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
            at android.support.v4.app.FragmentActivity.onResume(FragmentActivity.java:426)
            at com.xxx.xxx.MainActivity.onResume(MainActivity.java:74)
            at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1257)
            at android.app.Activity.performResume(Activity.java:6076)
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2975)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3017)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2392)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

I think the reason is that memory is recycled,but how can I solve it ?

I think this is "MainActivity" main code,it manage four fragments in it's bottom

    public RadioButton rbTabLottery, rbTabAward, rbTabCircle, rbTabMine;
    private int selectedId = R.id.rb_tab_lottery;
    private Fragment currentFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
        if (savedInstanceState == null) {
            Fragment fragment = getFragment(selectedId);
            getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,fragment).commit();
            currentFragment = fragment;
        }
    }

    @Override
    protected void initView() {//parent class is called
        rbTabLottery = findView(R.id.rb_tab_lottery);
        rbTabAward = findView(R.id.rb_tab_award);
        rbTabCircle = findView(R.id.rb_tab_circle);
        rbTabMine = findView(R.id.rb_tab_mine);

        rbTabLottery.setOnCheckedChangeListener(this);
        rbTabAward.setOnCheckedChangeListener(this);
        rbTabCircle.setOnCheckedChangeListener(this);
        rbTabMine.setOnCheckedChangeListener(this);
    }

    @Override
    protected void onResume() {
        super.onResume();     //the exception is here
        if (selectedId == R.id.rb_tab_award){
            rbTabAward.setChecked(true);
        }else if (selectedId == R.id.rb_tab_circle){
            rbTabCircle.setChecked(true);
        }else if (selectedId == R.id.rb_tab_mine){
            rbTabMine.setChecked(true);
        }else {
            selectedId = R.id.rb_tab_lottery;
            rbTabLottery.setChecked(true);
        }
        Fragment fragment = getFragment(selectedId);
        if (fragment != null){
            addOrShowFragment(getSupportFragmentManager().beginTransaction(), fragment);
        }
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked){
            selectedId = buttonView.getId();

            Fragment fragment = getFragment(selectedId);
            if (fragment != null){
                addOrShowFragment(getSupportFragmentManager().beginTransaction(),fragment);

            }
        }
    }

    private Fragment getFragment(int selectedId){
        switch (selectedId) {
            case R.id.rb_tab_lottery:
                return TabLotteryFragment.getInstance();
            case R.id.rb_tab_award:
                return TabAwardFragment.getInstance();
            case R.id.rb_tab_circle:
                return TabCircleFragment.getInstance();
            case R.id.rb_tab_mine:
                return TabMineFragment.getInstance();
            default:
                return TabLotteryFragment.getInstance();
        }
    }

    /**
     * @param transaction
     * @param fragment
     */
    private void addOrShowFragment(FragmentTransaction transaction,
                                   Fragment fragment) {
        if (currentFragment == fragment)
            return;

        if (!fragment.isAdded()) { 
            transaction.hide(currentFragment).add(R.id.fragment_container, fragment,
                    String.valueOf(selectedId)).commitAllowingStateLoss();
        } else {
            transaction.hide(currentFragment).show(fragment).commitAllowingStateLoss();
        }

        currentFragment = fragment;
    }
yuxingxin
  • 1
  • 4

1 Answers1

0

Make sure your app is in a valid state on resume.

There are a few important methods such as:

protected void onSaveInstanceState(Bundle outState){}

public void onRestoreInstanceState(Bundle savedInstanceState){}

protected void onResume() {}

See this docs Activity Lifecycle and onResume()

JoGe
  • 872
  • 10
  • 26
  • Maybe your fragment is invalid.. [check this post](http://stackoverflow.com/questions/28014781/switching-to-a-specific-fragment-gives-strange-java-lang-nullpointerexception) and have a look at the `onDestroyView()` – JoGe Jul 17 '15 at 07:21