BUG

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点

  1. Application中onCreate()中多了太多的操作
  2. Activity的setContentView(resId)前做了耗时操作
  3. 在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,网上查了,有几种方法,但是只有第一种管用

  1. 取消解绑,即注释掉unbinder.unbind();
  2. 给view赋值前,判断是否解绑,若已解绑则不赋值。判断依据bubind!=null,测试无效
  3. 给view赋值前,判断activity是否finish(),若已解绑则不赋值。判断依据getActivity().isFinish();测试无效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值