`

Android Fragment getActivity返回null解决

 
阅读更多

转自:http://blog.csdn.net/wantnowhy/article/details/24405845

在Android开发中,如果我们用到V4包里面的Fragment,在应用被切换到后台的时候,Activity可能被回收,但是创建的所有Fragment则会被保存到Bundle里面,下面是FragmentActivity的部分源码/**
     * Save all appropriate fragment state.
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Parcelable p = mFragments.saveAllState();
        if (p != null) {
            outState.putParcelable(FRAGMENTS_TAG, p);
        }

    }

,如果从最近使用的应用里面点击我们的应用,系统会恢复之前被回收的Activity,这个时候FragmentActivity在oncreate里面也会做Fragment的恢复,@Override
    protected void onCreate(Bundle savedInstanceState) {
        mFragments.attachActivity(this, mContainer, null);
        // Old versions of the platform didn't do this!
        if (getLayoutInflater().getFactory() == null) {
            getLayoutInflater().setFactory(this);
        }
        
        super.onCreate(savedInstanceState);
        
        NonConfigurationInstances nc = (NonConfigurationInstances)
                getLastNonConfigurationInstance();
        if (nc != null) {
            mAllLoaderManagers = nc.loaders;
        }
        if (savedInstanceState != null) {
            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
            mFragments.restoreAllState(p, nc != null ? nc.fragments : null);
        }
        mFragments.dispatchCreate();
    }

但是此时恢复出的Fragment,在调用getActivity的时候会返回null,具体什么原因还没详细研究,这里我的解决方法是在恢复Fragment之前把保存Bundle里面的数据给清除,也就是保存的Fragment信息,然后自己重新replace。方法如下:在FragmentActiivty的oncreate方法里面调用

if(arg0 != null)
        {
            String FRAGMENTS_TAG = "android:support:fragments";
            // remove掉保存的Fragment
            arg0.remove(FRAGMENTS_TAG);
        }

 

以上方法经本人测试,挂了,现在的方案是把代码移动到onResume方法中,不再放在onActivityCreated方法中了。

分享到:
评论

相关推荐

    Android中getActivity()为null的解决办法

    然而,不知道各位程序猿有没有遇过出现getActivity()出现null的时候导致程序报出空指针异常。 其实原因可以归结于因为我们在:  (一)切换fragment的时候,会频繁被crash  (二)系统内存不足  (三)横竖...

    android fragment 保存状态

    在Android应用开发中,Fragment是Activity的一个模块化组件,它可以在Activity中承载用户界面,并且可以独立于Activity进行生命周期管理。Fragment的设计使得开发者能够更好地构建适应不同屏幕尺寸和配置变化的应用...

    点击退出返回上一个Fragment

    在Android应用开发中,Fragment是Activity的一个模块化组件,它可以在Activity中添加、移除或替换,用于构建灵活且复杂的用户界面。"点击退出返回上一个Fragment"这一主题涉及到Fragment的回退栈管理和用户交互。...

    Android中fragment嵌套fragment问题解决方法

    当Fragment嵌套在另一个Fragment中,如Activity A嵌套Fragment B,B再嵌套Fragment C,如果C启动了一个新的Activity D并被finish掉,C中的getActivity()方法可能返回null。这是因为在Activity D被销毁后,Fragment ...

    Android Activity内嵌Fragment,当Activity recreate时Fragment被添加多次,造成界面重叠

    Fragment existingFragment = getActivity().getSupportFragmentManager().findFragmentByTag("my_fragment_tag"); if (existingFragment != null) { return existingFragment.getView(); } } // 创建新的...

    android getActivity.findViewById获取ListView 返回NULL的方法

    public class FragmentPage extends Fragment { View view = null; @Override @SuppressLint(HandlerLeak) public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)...

    Android getActivity()为空的问题解决办法

    FragmentActivity的源码显示,`onCreate()`方法中会尝试从Bundle中恢复Fragment的状态,而在这个过程中,如果Activity已经被回收,那么`getActivity()`返回的就是null。 解决这个问题有以下两种常见方法: 1. 覆盖...

    AndroidFragment数据传递

    在Android应用开发中,Fragment是UI组件的一部分,用于在大屏幕设备上构建多屏或模块化界面。...请参考提供的AndroidFragment压缩包文件,其中包含可运行的示例代码,以便更好地理解和实践这些概念。

    Fragment获取父Activity的TextView控件并修改内容

    但需要注意的是,只有当Fragment的状态是`ActivityCreated`之后,`getActivity()`才不会返回null,因此这个操作应该在Fragment的`onActivityCreated()`或`onViewCreated()`方法中进行。 ```java @Override public ...

    Fragment内嵌套Fragment

    在Android应用开发中,Fragment是Activity的一个模块化组件,它允许开发者在不重启Activity的情况下,动态地添加、移除或替换界面的一部分。"Fragment内嵌套Fragment"是一种常见且实用的设计模式,尤其在构建复杂...

    深入浅析Android Fragment(下篇)

    在Android应用开发中,Fragment是UI组件的重要组成部分,它允许开发者在同一个Activity中展示多个可交互的视图。本文将深入探讨如何管理Fragment的回退栈、如何与Activity交互以及最佳实践,还有如何利用Fragment...

    Fragment之间通过Activity通信

    在Android应用开发中,Fragment是UI组件的一部分,用于在Activity中展示可交互的内容。Fragment通信是Android开发中的重要概念,特别是在构建复杂用户界面时。在这个简单的例子中,我们将探讨如何在Fragment A和...

    Android中findViewById返回为空null的快速解决办法

    "Android中findViewById返回为空null的快速解决办法" Android中findViewById返回为空null的快速解决办法是指在Android开发中,使用findViewById方法来获取视图控件时,返回为空null的解决方法。在Android中,...

    Android fragment用法

    在Android应用开发中,Fragment是Android SDK中的一个重要组件,它被设计用来支持多屏幕适配,使得在不同尺寸和方向的设备上展示复杂界面变得更加灵活。`Fragment`可以看作是一个可插入到`Activity`中的可重用部分,...

    Android Fragment

    - **空指针异常**:在Fragment的生命周期方法中,确保检查getActivity()是否为null,防止在Activity未创建时调用其方法。 综上所述,Fragment是Android应用开发中的关键组件,熟练掌握其使用能提升应用的用户体验...

    FragmentView

    View v = inflater.inflate(R.layout.fragment1, null); SimpleAdapter sa = new SimpleAdapter(getActivity(), list, R.layout.fragment1_item, new String[] { "name" }, new int[] { R.id.fragment1Tv }...

    Android Fragment的用法实例详解

    Fragment是Android平台上的一个重要组件,它是在Android 3.0版本(API级别11)时引入的,主要是为了适应大屏幕设备,如平板电脑,提供更动态和灵活的用户界面设计。Fragment允许开发者将应用程序的功能分割成独立的...

Global site tag (gtag.js) - Google Analytics