[记录Android开发过程中所遇问题 及解决方法]
(1) 问题: ActionBar 更改返回图标
解决方法:a1.
getActionBar.setDisplayHomeAsUpEnabled(true);
getActionBar.setHomeAsUpIndicator(R.drawable.icon_back);
要求当前API最低版本18,无法从根本解决我的问题
<style name="style_titlebar" parent="Theme.AppCompat.Light">
<item name="android:homeAsUpIndicator">@drawable/icon_back</item>
</style>
设置style
<activity android:name="com.xxx.activity.Activity" android:theme="@style/style_titlebar"> </activity>
但是这种也会遇到问题,Theme.AppCompat.Light不存在,需要在在sdk中找到/android-support-v7-appcompat 然后导入 将之设为目标工程的依赖~~~
(2) 问题: 在fragment中调用onOptionsItemSelected时,无效
解决方法: 在onCreate中 需要设置setHasOptionsMenu(true);
(3) 问题: 在onPostCreate回调函数的意义
解决方法:在android中一个Activity的创建时,界面的绘制是需要时间的,当我们需要执行某个操作时,如果界面复杂,尚未绘制完成,很容易导致anr.那么如何确保在界面绘制完成,这就是此函数的意义所在了.onPostCreat是在界面绘制完成之后相继执行的.
(4) 问题: 在vio博客项目中,将项目从eclipse转到studio上时,报出Couldn't load weibosdkcore from loader dalvik.system.PathClassLoader 这样一个错误
解决方法:这个异常是表示找不到weibosdkcore.so文件,在studio中引用.so文件时需要build.gradle中引入libs,如下图
(5) 问题:在两个以上的fragment中,每个fragment都添加了ViewPager,然而第二个fragment中得ViewPager不加载subFragment,即:不显示内容
解决方法:在实例化FragmentPagerAdapter时,传入参数常为:
mViewPager.setAdapter(new CommonFragmentPagerAdapter(getActivity().getSupportFragmentManager(), mFragments));这个参数正是导致此现象的元凶,其参数正确形式应如下:mViewPager.setAdapter(new CommonFragmentPagerAdapter(getChildFragmentManager(), mFragments)); 这样就愉快的解决了此问题(6) 问题: 在ListView使用getViewTypeCount()时,会意外出现数组下标越界,这个问题很奇怪。明明return的是正确的的Count啊。
解决方法: 原因是这样的,在Android中设置Type值必须是从0开始,依次递增,如果随便设置就会导致这样的问题。很奇怪,如果不是我碰到,真的不会知道。
public static final int TYPE_TITLE = 0;//必须从零开始 否则会出现下标越界的情况 public static final int TYPE_CITY = 1;
(7) 问题: ExpandableList刷新childView的数据。。。坑啊。。。notifyDataChanged()无效。。。
解决方法: 不得不说这是一个很坑的问题,不同于ListView的是,notifyDataChanged此方法只能适用于刷新GroupView的 数据与已经展开组的数据,想要刷新全部ChildView的数据还需要我们再做一些操作。(8) 问题: ListView 与 CheckBox 同时设置了点击事件冲突问题解决notifyDataSetChanged(); for (int i = 0; i < getGroupCount(); i++){ if (mEListView.isGroupExpanded(i)){ mEListView.collapseGroup(i); mEListView.expandGroup(i); } }
解决方法: 由于功能需求 点击ListView的item时要求同时触发CheckBox改变状态 于是写了一个List保存已选中的item唯一标识 但是CheckBox与ListView的点击事件冲突的情况下 不得已剑走偏锋 却也不失为妙招 将CheckBox的clickable设为false 屏蔽其点击事件 这样就点击时就默认触发其父控件的点击事件 成功解决冲突
(9) 问题: 高德 微信等需要签名才能生效调用调试方法
解决方法: 由于android studio在调试是默认无签名(我没找到) 这样就无法经行微信sdk的调试 所以有了这样一个方法 在build.greadle中如下配置:两者位置不能反 反了编译通不过signingConfigs { //gradle assembleRelease release { storeFile file(“xxxxxxxxxxxxxxxxxxxxxx/jiaxin0802.jks") storePassword “xxxx" keyAlias “xxxx" keyPassword “xxxx" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } debug{ minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } }
PS 小知识点: ViewPager向后多缓存一个页面 pager.setOffscreenPageLimit(2);
(10) 问题: listview中的item与button点击事件冲突解决方法: (1)在布局文件的根元素上中添加属性android:descendantFocusability="blocksDescendants"(2)在Button中添加属性android:focusable="false"和android:clickable="true"
(12)问题 : 卸载应用的同时 删除应用数据(11) 问题: Eclipse打开后挂在Android SDK Loader 0%解决方法: 只能强制退出Eclipse,再次打开无效。目前解决办法是强退后手动清除cache:然后重启Eclipse另外,stackoverflow上也有人讨论这个问题:http://stackoverflow.com/questions/13489141/eclipse-hangs-at-the-android-sdk-content-loader,提出了许多办法,大多是清除用户数据之类
<span style="font-size:18px;">cd ~/.android rm -rf ./cache rm -r ./ddms.cfg</span>
解决方法 : 通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾数据
(13)问题(完善10) : ListView的item中嵌入Button类的组件时,item点击事件失效
解决方法 : 在item的布局模块的 根布局 中加入android:descendantFocusability=”blocksDescendants”属性就OK了主要原因是子控件与viewgroup的焦点问题, android:descendantFocusability有三个属性:beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点