简体   繁体   English

片段中的getActivity()返回null。 父活动中的FragmentPagerAdapter是否有问题?

[英]getActivity() in fragment returns null. Issue with FragmentPagerAdapter in parent activity?

I have an activity that hosts a viewPager with two fragments. 我有一个托管有两个片段的viewPager的活动。 I'm running into an issue where a call to getActivity() in my fragment is returning null after the activity is destroyed and then re-created (I am changing a system setting while my application is paused in the background which causes the activity to be destroyed and then re-created). 我遇到了一个问题,即活动被销毁后重新创建后,我的片段中对getActivity()的调用返回null(我正在更改系统设置,而我的应用程序在后台暂停却导致该活动被销毁,然后重新创建)。 Here is what my parent activity looks like. 这是我父母活动的样子。

public class MainActivity extends AppCompatActivity {

private CalculatorPagerAdapter mSectionsPagerAdapter;

/**
 * The {@link ViewPager} that will host the section contents.
 */
private ViewPager mViewPager;
private final int HISTORY_PAGE_INDEX = 1;
private final int CALCULATOR_PAGE_INDEX = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    mSectionsPagerAdapter = new CalculatorPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

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

        }

        /**
         * Refreshes the listView in the history fragment whenever the user moves to it.
         * @param position
         */
        @Override
        public void onPageSelected(int position) {
            CalculatorPagerAdapter fragmentPagerAdapter = (CalculatorPagerAdapter) mViewPager.getAdapter();
            if(position == HISTORY_PAGE_INDEX){
                ((HistoryFragment) fragmentPagerAdapter.getItem(HISTORY_PAGE_INDEX)).refreshHistory();
            }else if(position == CALCULATOR_PAGE_INDEX){
                //((CalculatorFragment) fragmentPagerAdapter.getItem(CALCULATOR_PAGE_INDEX)).refreshCalculator();
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);

}

@Override
public void onDestroy(){
    super.onDestroy();
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        Intent intent = new Intent(this, SettingsActivity.class);
        startActivity(intent);
        return true;
    }

    return super.onOptionsItemSelected(item);
}


/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
public class CalculatorPagerAdapter extends FragmentPagerAdapter {

    HistoryFragment historyFragment;
    CalculatorFragment calculatorFragment;

    public CalculatorPagerAdapter(FragmentManager fm) {
        super(fm);
        historyFragment = new HistoryFragment();
        calculatorFragment = new CalculatorFragment();
    }


    @Override
    public Fragment getItem(int position) {
        if (position ==0) return calculatorFragment;
        else return historyFragment;
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Calculator";
            case 1:
                return "History";
        }
        return null;
    }
}

} }

I've noticed the lifecycle calls of the activity and fragment happen in the following order. 我注意到活动和片段的生命周期调用按以下顺序进行。

On initial creation (normal) 初始创建时(正常)

  1. activity.onCreate activity.onCreate
  2. fragment.onAttach 片段附加
  3. fragment.onCreateView fragment.onCreateView

When I change the system setting that triggers activity destroy and recreation (issue here) 当我更改触发活动破坏和娱乐的系统设置时(在此处发出)

  1. activity.onDestroy 销毁活动
  2. fragment.onDestroy 破坏片段
  3. fragment.onAttach (no parent activity exists?) fragment.onAttach(不存在父活动吗?)
  4. activity.onCreate activity.onCreate
  5. fragment.onCreateView fragment.onCreateView

After this happens getActivity from the fragment retuns null. 发生这种情况后,片段中的getActivity将重新调整为null。 Am I handling my fragments incorrectly in my parent activity? 我在家长活动中处理碎片的方式不正确吗?

This is the logcat from the crash that results from trying to use a null getActivity(). 这是由于尝试使用null getActivity()而导致崩溃的日志猫。 This is triggered by the onPageSelected method from the OnPageChangeListener that is attached to my viewpager. 这是由附加到我的viewpager的OnPageChangeListener中的onPageSelected方法触发的。

11-26 12:56:21.739 31769-31769/com.example.keegan.securetipping I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@d035425 time:1218086194
11-26 12:56:24.864 31769-31769/com.example.keegan.securetipping E/InputEventReceiver: Exception dispatching input event.
11-26 12:56:24.864 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext()' on a null object reference
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at com.example.keegan.securetipping.HistoryFragment.refreshHistory(HistoryFragment.java:88)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at com.example.keegan.securetipping.MainActivity$1.onPageSelected(MainActivity.java:54)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1794)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:569)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:553)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2102)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.View.dispatchTouchEvent(View.java:8547)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2400)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2093)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2372)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1722)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.app.Activity.dispatchTouchEvent(Activity.java:2742)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2333)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.View.dispatchPointerEvent(View.java:8742)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4136)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4002)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3557)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3610)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3576)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3693)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3584)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3750)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3557)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3610)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3576)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3584)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3557)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5823)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5797)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5768)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5913)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.os.MessageQueue.nativePollOnce(Native Method)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.os.MessageQueue.next(MessageQueue.java:143)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.os.Looper.loop(Looper.java:195)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at android.app.ActivityThread.main(ActivityThread.java:5373)
11-26 12:56:24.868 31769-31769/com.example.keegan.securetipping E/MessageQueue-JNI:     at java.lang.reflect.Method.invoke(Native Method)
11-26 12:56:24.869 31769-31769/com.example.keegan.securetipping D/AndroidRuntime: Shutting down VM
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime: FATAL EXCEPTION: main
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime: Process: com.example.keegan.securetipping, PID: 31769
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext()' on a null object reference
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at com.example.keegan.securetipping.HistoryFragment.refreshHistory(HistoryFragment.java:88)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at com.example.keegan.securetipping.MainActivity$1.onPageSelected(MainActivity.java:54)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1794)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:569)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:553)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2102)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.View.dispatchTouchEvent(View.java:8547)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2400)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2093)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2372)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1722)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.app.Activity.dispatchTouchEvent(Activity.java:2742)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2333)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.View.dispatchPointerEvent(View.java:8742)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4136)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4002)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3557)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3610)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3576)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3693)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3584)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3750)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3557)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3610)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3576)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3584)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3557)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5823)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5797)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5768)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5913)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.os.MessageQueue.nativePollOnce(Native Method)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.os.MessageQueue.next(MessageQueue.java:143)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:195)
11-26 12:56:24.874 31769-31769/com.example.keegan.securetipping E/AndroidRuntime:   at android.app.ActivityThread.main(Act

This is the code bit that is from my HistoryFragment class that throws the exception. 这是来自我的HistoryFragment类的引发异常的代码位。 I just call getApplicationContext in order to get an error for this example. 我只是调用getApplicationContext以获取此示例的错误。 Normally the error would be thrown in my FetchHistoryEntries AsyncTask. 通常,该错误将引发在我的FetchHistoryEntries AsyncTask中。

/**
 * Refreshes the listView in the history fragment with data from the history database.
 */
public void refreshHistory(){

    getActivity().getApplicationContext();
    new FetchHistoryEntries(getActivity()).execute();
}

My history fragment only contains a listView. 我的历史记录片段仅包含一个listView。 This is its XML. 这是它的XML。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/history_listview"/>

When an activity is destroyed, you lose the context that you are using, that's why your application is throwing an exception, because you are calling getActivity() after you destroyed activity which throws a null pointer exception, to avoid this you should change your refreshHistory to the following: 当活动被销毁时,您会丢失正在使用的上下文,这就是您的应用程序引发异常的原因,因为销毁活动后会引发null指针异常的原因是调用getActivity() ,为避免这种情况,您应该更改refreshHistory到以下内容:

public void refreshHistory(){
    if (isAdded()) {
        getActivity().getApplicationContext();
        new FetchHistoryEntries(getActivity()).execute();
    }
}

isAdded() return true when the fragment is attached to the activity and the activity is not null. 当片段附加到活动上并且活动不为null时, isAdded()返回true。

You should also consider cancelling your AsyncTask when your activity is destroyed, you can do it like the following: First define a global variable of the same type of your AsyncTask like this FetchHistoryEntries task; 您还应该考虑在活动被销毁时取消AsyncTask,可以按照以下步骤进行操作:首先,定义一个与AsyncTask类型相同的全局变量,例如FetchHistoryEntries task; Second, execute your global task like this 其次,像这样执行全局任务

task = new FetchHistoryEntries(getActivity()).execute;

Finally, in your onDestroy overridden method cancel your task like this: 最后,在您的onDestroy重写方法中,像这样取消您的任务:

if (task != null) {
    task.cancel(true);
}

Hope this helps you, good luck 希望这对您有帮助,祝您好运

I actually solved this by switching to a FragmentStatePagerAdapter opposed to just a FragmentPagerAdapter. 我实际上是通过切换到FragmentStatePagerAdapter而不是FragmentPagerAdapter来解决此问题的。 The state pager adapter makes it easier to save and restore a fragments state which was what my problem was. 状态寻呼机适配器使保存和恢复片段状态变得更加容易,这正是我的问题所在。 This gist had a handy example. 这个要点有一个方便的例子。 https://gist.github.com/nesquena/c715c9b22fb873b1d259 https://gist.github.com/nesquena/c715c9b22fb873b1d259

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Android:从Activity调用片段函数,该片段函数包含getActivity()并返回null - Android: Call fragment functions from Activity, the fragment function contains getActivity() and returns null 在Fragment中调用getActivity()返回null - Calling getActivity() inside a Fragment returns null FindFragmentByTag返回null。 - FindFragmentByTag returns null. 即使片段已完成构建,getActivity()。findViewById(int id)仍返回null - getActivity().findViewById(int id) returns null even after fragment has completed building onCreateView中的Android片段getActivity()。getApplicationContext()为null - Android Fragment getActivity().getApplicationContext() in onCreateView is null 使用FragmentPagerAdapter从主活动中调用Fragment方法 - Calling Fragment Method From Main Activity with FragmentPagerAdapter 将数据从活动传递到片段返回Null - Passing Data From Activity To Fragment Returns Null 应用恢复时片段中的getActivity null - getActivity null in fragment when app resumes 为什么在使用getactivity()查找视图时有时会跳过在FragmentPagerAdapter中创建的片段? - Why fragment created in FragmentPagerAdapter is skipped sometimes when using getactivity() to find view? 从父活动获取值返回 null - Getting a value from parent activity returns null
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM