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

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

在开发项目中有时会碰到getActivity函数为空的情况,    导致apk空指针崩溃问题,  看代码逻辑没有明显的原因。

如果看Activity.Java、FragmentActivity.java的源码就可以找到原因。 当activity实例在后台时, 系统在回收资源时很可能回收掉Activity,  并在onSaveInstanceState函数里保存fragment的状态, 再次打开该Activity时, 在onCreate方法里取出bundle里的fragment状态, 但这时fragment对应的Activity早就不在了, 所以getActivity为空。

摘自FragmentActivity.java:

protected void onCreate(Bundle savedInstanceState) { ....... if (savedInstanceState != null) { Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG); mFragments.restoreAllState(p, nc != null ? nc.fragments : null); } mFragments.dispatchCreate(); } protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Parcelable p = mFragments.saveAllState(); if (p != null) { outState.putParcelable(FRAGMENTS_TAG, p); } }

从源码可以看出解决方案: 1、  覆盖onSaveInstanceState函数, 不保存到bundle; 2、  覆盖onCreate方法, 删除FRAGMENTS_TAG参数。(注意:Activity和FragmentActivity对FRAGMENTS_TAG的定义不同)

例如:

public class TestActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { savedInstanceState.remove("android:support:fragments"); //注意:基类是Activity时参数为android:fragments, 一定要在super.onCreate函数前执行!!! } super.onCreate(savedInstanceState); ... } //或者 protected void onSaveInstanceState(Bundle outState) { //super.onSaveInstanceState(outState); //注释掉该方法, 即不保存状态 }

以上就是Android getActivity()为空的问题解决办法的讲解,如有疑问请大家留言或到本站社区讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-08-03 07:03:37

Android getActivity()为空的问题解决办法的相关文章

Android 编译出错版本匹配问题解决办法

Android 编译出错版本匹配问题解决办法 解决问题的关键在于版本匹配, compileSdkVersion compileSdkVersion targetSdkVersion 这三个参数的整数值都应该是一样的,这里我全部设置成23, 在这之前我还升级了:appcompat到com.Android.support:appcompat-v7:24.0.0 最终编译成功,剩下的问题都是代码问题了 apply plugin: 'com.android.application' android {

Android SDK Manager无法更新问题解决办法

Android SDK Manager无法更新问题解决办法 最近玩ubuntu系统,以前Windows下下载的SDK文件不能用了,只能重新下载,安装完Eclipse和ADT插件,却发现无法更新SDK,显示为: Fetching https://dl-ssl.Google.com/android/repository/addons_list-1.xml Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_l

Android setTag方法的key问题解决办法_Android

android在设计View类时,为了能储存一些辅助信息,设计一个一个setTag/getTag的方法.这让我想起在Winform设计中每个Control同样存在一个Tag. 今天要说的是我最近学习android遇见的setTag的坑.一般情况下我们只需要使用唯一参数的setTag方法.但有时我们需要存储多个数据,所以这个时候我们就需要使用带key的重载. 文档是描述:" The specified key should be an id declared in the resources of

mysql中CONCAT值为空的问题解决办法

天在做opencart开发的时候,需要对用户表中用户的电话号码和区号连接起来,于是使用了concat方法,  代码如下 复制代码 SELECT CONCAT(isdcode,telephone) FROM gb_customer 竟然发现很多NULL列,telephone明明是有值的,于是查询了相关concat方法, 解释如下  代码如下 复制代码 mysql CONCAT(str1,str2,-)   返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL.或许有一

Android setTag方法的key问题解决办法

android在设计View类时,为了能储存一些辅助信息,设计一个一个setTag/getTag的方法.这让我想起在Winform设计中每个Control同样存在一个Tag. 今天要说的是我最近学习android遇见的setTag的坑.一般情况下我们只需要使用唯一参数的setTag方法.但有时我们需要存储多个数据,所以这个时候我们就需要使用带key的重载. 文档是描述:" The specified key should be an id declared in the resources of

Android中Fragment 重叠遮盖问题解决办法

1.导致Fragment 重叠 和遮盖的原因 主要还是因为Fragment的状态保存机制,当系统内存不足时,Fragment的主Activity被回收,Fragment的实例并没有随之被回收. Activity被系统回收时,会主动调用onSaveInstance()方法来保存视图层(View Hierarchy),所以当Activity通过导航再次被重建时,之前被实例化过的Fragment依然会出现在Activity中,然而从上述代码中可以明显看出,再次重建了新的Fragment,综上这些因素导

Android webview旋转屏幕导致页面重新加载问题解决办法

Android webview旋转屏幕导致页面重新加载问题解决办法 1. 在create时候加个状态判断 protected void onCreate(Bundle savedInstanceState){ ... if (savedInstanceState == null) { mWebView.loadUrl("your_url"); } ... } 2. 重载保存状态的函数: @Override protected void onSaveInstanceState(Bundl

Android 使用volley过程中遇到的问题解决办法

Android 使用volley过程中遇到的问题解决办法 本文主要介绍使用 volley 过程中遇到的问题,错误提示: com.android.volley.NoConnectionError: java.io.InterruptedIOException",内容加载失败,问题出在重复调用 queue.start() 方法. 错误提示:com.android.volley.NoConnectionError: java.io.InterruptedIOException",然后就内容加

Android setButtonDrawable()的兼容问题解决办法

Android  setButtonDrawable()的兼容问题解决办法 setButtonDrawable()的兼容问题 API16实现 /** * Set the background to a given Drawable, identified by its resource id. * * @param resid the resource id of the drawable to use as the background */ public void setButtonDraw