1 三星手机onActivityResult(int requestCode, int resultCode, Intent data)无效
打开camera或图库的时候取不到返回的图片,因为原activity被销毁了。
网上搜了一篇解决方法,还没试过。
关于三星手机拍照返回的时候,activity被销毁创建的问题
问题描述:
三星手机拍照成功,之后返回后activity数据丢失,被销毁了。既activity调用ondestory()-onCreate()
但是其他的手机却没有这样的问题。
其实不是调用摄像头拍照会导致Activity销毁,而是只要你打开新的Activity,那么原Activity都会被销毁。(三星手机测试是这样的)
解决方法:
1, 刚开始以为是内存不足造成的问题,所以解决办法是:onSaveInstanceState()保存图片地址,oncreate()的时候重新获取
2,由于拍照之后需要裁剪,所以这个地址再次无法获取,所以使用了onactivityforresult方法返回的intent.getdata获取到裁剪的图片地址,然后上传
3,以上俩步只能解决activity上出现的问题,当activity上有fragment的时候就会出现每次上传完成头像后,页面都会需要重新构建,感觉就像是程序crash了一样
4,最终的解决办法是禁止activity在拍照的时候被销毁。只需要在AndroidMainifest.xml下标签下配置android:configChanges=”orientation|keyboardHidden” 。重写activity的onConfigurationChanged方法,方法只需要super.onConfigurationChanged就可以了
5, 4所述的方式在API Level 13前是可以的,在API Level 13后需要新添加一个属性screenSize
既android:configChanges=”orientation|keyboardHidden|screenSize”这样就可以了
demo: http://git.oschina.net/AndroidUI/cameraphoto01
测试了无效。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
android:configChanges="keyboardHidden|screenSize|orientation"
2 ViewPager嵌套ViewPager
viewpager可以嵌套viewpager没有问题,但是如果是下面这种情况要注意:
在activity中用ViewPager嵌套了多个Fragment,而其中一个Fragment又包含TabLayout+ViewPager(B),ViewPager(B)中又有多个Fragment,这样的话,2个ViewPager的id是不能相同的
3 setClickable(false)
设置一个控件的setClickable(false)后,发现没有效果。
解决方法:
setClickable(false)方法一定要在setOnClickListener()方法之后。
如果在setOnClickListener()
前面,要先实现无法点击,
解决方法如下:
btn.setEnabled(false);
btn.setClickable(false);
4 Android6.0及以上无法写入sd
今天发现即使在AndroidManifest.xml
中添加了权限,可是还是无法往SD卡写入数据,因为6.0及以上系统在权限方面比较严格,用的时候在申请全写,这样比较安全,但是也比较繁琐,如果想简单的话,把targetSdkVersion 22
设置为22即可。
5 三星手机不显示Toast
部分三星手机不显示Toast,是因为手机禁止了通知,也就禁止了Toast,当我们设置为显示通知的时候,就会显示Toast。经测试有效。
参考: android 某些三星手机上不显示通知Notification和消息Toast
6 启动页白屏
我们在做app时,一般都有启动页,一般是app的logo,持续几秒,然后进入主页面或者是登陆界面,有事启动页白屏,原因有2点
- Application中onCreate()中多了太多的操作
- Activity的setContentView(resId)前做了耗时操作
- 在onCreate()方法来调用了requestWindowFeature()方法来设置全屏,这样也会导致先显示白屏(黑屏)再跳转。
方法
设置style,属性android:windowBackground
为null
<style name="Theme.beginBackground" parent="BaseTheme">
<item name="android:windowBackground">@null</item>
</style>
在让当前的activity(启动页)的theme设为该style
<activity
android:name="com.cqc.sample.activity.WelcomeActivity"
android:theme="@style/Theme.beginBackground">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
——-2017-6-28—————————————-
今天测试了一下,方法可行,总结如下:
activity
配置
android:configChanges="keyboardHidden|orientation|screenSize"
Activity
中重写方法onConfigurationChanged
,里面什么也不要写,(不加这个方法Activity
还是会被销毁)
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//什么都不要做
}
其它
参考:
Android启动页面有白屏(或者黑屏)过渡解决方案
7 Fragment中解绑ButterKnife后view为null,报NullPointerException
在fragment中解绑
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
如果我们网络请求用的是异步,如果获取到请求结果前,已经解绑了,那么fragment所有的view都是null,如果给设置view赋值,那么会报错NullPointerException
,网上查了,有几种方法,但是只有第一种管用
- 取消解绑,即注释掉
unbinder.unbind();
- 给view赋值前,判断是否解绑,若已解绑则不赋值。判断依据
bubind!=null
,测试无效 - 给view赋值前,判断activity是否finish(),若已解绑则不赋值。判断依据
getActivity().isFinish();
测试无效