Android问题收集——实际项目中遇到的问题及解决方案

1、WebView闪烁问题
场景:游戏详情,webview上下方都有控件,然后web加载内容后有一定几率不停闪烁
原因分析:未知,可能是webview不能跟太多控件放一起。
解决方案:用TextView显示html格式字符串http://www.cnblogs.com/mxgsa/archive/2012/11/15/2760256.html

2、android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
场景:启动弹窗就报错
原因:我的弹窗是悬浮在其他应用上的,应使用系统级悬浮窗,但代码中使用了应用级的悬浮窗
解决方案:换回合适定义的弹窗即可。

3、java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged
场景:一打开有viewpager的页面就报错,
原因:在更新adapter的内容后调用一下adapter的notifyDataSetChanged方法,否则在ADT22以上编译程序就会报错。
解决方案:在每次内容改变后都调用adater的 notifyDataSetChanged方法。参考网址如下

4、Link of class 'Landroid/support/v7/widget/RecyclerView;' failed
场景:使用RecyclerView,编译时没报错,一进入使用了RecyclerView的界面就报错,十分诡异。
原因:详细细节暂时未知,v7和v4版本不对应,v7要用的部分类v4包没有,经导入v7源码到项目确认的,会有类引用不到。使用网上提供的demo包里面的jar包也会报错。
解决方案:
如果是用Android Studio到目录 sdk\extras\android\support\v7\recyclerview\libs下面将拿android-support-v7-recyclerview.jar,再去android-sdk\extras\android\support\v4 拿到android-support-v4.jar放到项目里就可以打包了。当然,我support就是更新到22.1.1。关键是拿版本对应的两个包。

如果上面的两个路径拿不到包,可以采用下面网页的解压方法

不过很神奇的是这样只能在Android Studio 打出正常的包。在eclipse还是会报错,eclipse只能到 sdk\extras\android\m2repository\com\android\support\recyclerview-v7\22.1.1 目录下的recyclerview-v7-22.1.1-sources.jar 解压拿源码到src目录下才能正常编译。

这从侧面说明了google确实在逐步放弃eclipse,还是赶紧跑路去用Android Studio才行,否则后面问题会越来越多。

5、一锁屏就调用了 onDestroy方法
场景:如题
原因:是在Anctivity代码中硬设置了横竖屏所以会重新onCreate
解决方案:横竖屏在AndroidManifest里面对应Activity标签中设置并且加一句android:configChanges="orientation|keyboardHidden" 防止重新运行程序。

6、使用 PathEffect 配合Canvas.drawLine无法画出虚线
场景:在自定义控件里面要显示一个线框,结果画不出虚线。代码如同下面网页
原因:在网上看到有人说谷歌可能已经不支持用drawLine方法画虚线了 http://www.apkbus.com/forum.php?mod=viewthread&tid=122065&page=1#pid1949781 
解决方案:换一种方法即可,使用drawPath方法 。
核心代码
        Path path = new Path(); 
        path.moveTo(0, 5); 
        path.lineTo(this.getWidth(), 5); 
        PathEffect effects = new DashPathEffect(new float[] { 5, 5, 5, 5 }, 1); 
        paint.setPathEffect(effects); 
        canvas.drawPath(path, paint); 
6、Android界面布局层次过多问题
场景:如题
原因:使用了TabHost+activity比使用viewpager+fragment多三层布局,这三层布局主要是来自于activity三层父布局。
解决方案:除了改用fragment之外还有其他一些技巧可以砍掉两层,最终内容上层布局只剩5层,而大部分手机能支持到12层左右,这样整个布局内容的限制就大大减少了。

7、Android handler 使用sendEmptyMessage发送消息时总是不会触发消息处理
场景:如题
原因:需要handleMessage这个方法才会处理题中提到的方法发出的消息,dispatchMessage才是对应Message.obtain(handler, “”).sendToTarget()这种方法的,而且一个handler里面不能同时继承这两个方法,这方面需要继续了解原因。
解决方案:集成对应方法做处理即可。

8、打开其他界面是经常出现切换效果不对的问题
场景:
启动actiity时总是出现出现上进下出的切换效果,但是明明是设置了淡入淡出的效果
原因:
设置切换效果要在startActivity方法后立刻设置,另外需不需要再onCreate里设置需要后续证实。
解决方案:
在整个项目的基类BaseActivity里面覆盖startactivity即可加入代码即可

9、经常出现退出activity后退出桌面的问题,
场景:如题
原因: 应该和使用了getBaseContext方法获取Context并在启动activity时使用了
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
新建了一个栈
解决方案:使用Activity.this取代getBaseContext

10、点击home键切出桌面后再点击图标进入界面就重新启动应用,如果主界面或者启动界面设置了android:launchMode=“singleTask” 就会导致重新启动后不会显示原来的最顶部的界面
场景:
主界面为MainActivity启动了GameinfoActivity,然后点击Home切出到桌面,再点击应用图标,这个时候就会重启应用,并且最后是显示MainActivity。但是长按home键通过历史任务列表进入应用却能显示GameinfoActivity。
原因:
网上很多人说可以去掉  android:launchMode=“singleTask”  解决,虽然去掉后问题确实不存在了,但是这个启动模式有些情况下是必须的,所以这不是根本的解决办法。问题的根本原因是点击图标后应用重新启动,这个恐怕是Android的机制,这种启动是在原有的历史列表基础上重新启动新的界面。在我的应用来说就是重新启动了一次 StatActivity->MainActivity,GameInfoActivity再StartActivity启动时还存在与任务栈中,但由于MainActivity的singleTask模式,GameinfoActivity被清除掉了,原来的MainActivity重新显示到顶部。
解决方案:
解决问题的关键在于判断这次启动是不是点击图标后重复启动,我的判断方法是只要界面列表中存在不是 StartActivity和MainActivity的Activity就认为是重复启动,在StartActivity就直接finish(),如果不重复会跳转到MainActivity然后finish,这样就显示任务栈中最顶部的Activity了,问题解决。如果你的应用没有保存Activity列表可以使用获取当前任务栈,然后获取栈中所有Activity来判断。如果自己应用保存了Activity列表一定记得要在Activity onDestroy时将其删除。

11、去除ScrollView,ListView,GridView边缘模糊效果
场景:
题中三种控件都默认带有边缘模糊效果,就是再这些控件滑动时,跟其他空间的交界处会出现一种半透明的模糊效果,这种效果默认比较宽,影响了原本界面的观感。
原因:
这个是系统控件默认的效果,我们可以通过设置去掉。
解决方案:
可以通过下面第一句代码设置竖直方向的模糊效果关闭,第二句可以设置颜色,第三句可以设置宽度。
setVerticalFadingEdgeEnabled(false); 
setCacheColorHint(Color.RED); 
setFadingEdgeLength(4);

也可以再xml中设置这个属性
android:fadingEdge=“none"
这个效果可以分开竖直和水平方向设置是否启用。

12、ScrollView 嵌套 GridView最后一行被显示不全
场景:
如题。
原因:
未知。
解决方案:
gridview设置一点paddingBottom可以解决问题,连paddingBottom都可以显示完整。

13、Android 如何让EditText不自动获取焦点
场景: EditText在进入界面后会抢占焦点,在界面再次显示后会再次抢占焦点。
原因:
解决方案:
android:windowSoftInputMode=“stateHidden" 再manifest.xml设置activity后第一次进入就不会在抢占焦点,但是要返回界面后不会再次抢占就需要 在EditText的父级的同级控件注意不是父级控件中找一个,设置成 android:focusable="true" android:focusableInTouchMode=“true”,这样就会截断其的抢占行为。 
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值