安卓、常见错误、规整

1、当当前方法里面要跳出去写另外一个方法的时候,如果另外那个方法里面如果需要大环境,那么必须把另外那个方法放在当前方法外面,去获取大环境。

2、注意,在进行下载操作时,如果是下载到SD卡中,别忘了加权限。
3、注意,用隐式意图跳转时、如果是要加category属性,那么方法不是set~,而是add~
4、注意,一般listview和gridview的适配器不要抽取到一个类中单独书写,不然可能出现开启不了活动的情况,原因是,加载条目的事情,必须在系统开启活动之前完成,单独写一个类的时候,运用打气筒时,需要传一个上下文,因为此时,活动还没有开启,所以不能用this,直接new也会报错,new其他活动的实例可能能成功但是造成了不必要的麻烦。
5、注意,在使用自定义控件,填充view的时候,注意不要使用重载方法addView(),而是直接用this.addView(),直接添加,要不然会出错。
6、注意,如果要使自定义控件有点击事件,不仅仅要重写一个isClickable()方法,并返回true,而且在只用XML(布局文件)中使用自定义控件的时候还要设置android:clickable="true",要不然不具备点击事件,也就导致了添加了选择器却点击后不变样子的情况。
7、注意,在设置自定义控件的自定义属性的时候(attrs.xml),属性的返回值类型一定要写成小写,要不然系统不识别,例如"String"一定要写成"string"。
8、用弹窗对象Buelder对象的create()方法可以得到一个Dialog对象用来执行dismiss(),以达到关闭窗体的作用,但是,每次执行create(),都是重新NEW了一个AlertDialog对象,所以,如果在局部使用的时候,最好在大环境中定义出来(全局),这样就不会出错了。
9、当为一个布局设置背景的时候,不要单独使用ImageView控件来设置src,而是直接在那个布局的属性中添加background,要不然可能出现背景左右没有填满屏幕的情况。
10、抽取样式也有一定的格式,
【属性值】>
11、在状态选择器中,使用图片时,如果需要一张纯色的图片,不可以直接设置颜色值,这个时候可以用到color.xml这种东西,在res -> values -> colors.xml 中定义,作用就是将一个纯色转换成一个纯色的图片资源。

12、在广播接收者中,如果OnReceive里面的方法执行的时间超过10秒的话,就会不继续执行,如果必须要执行耗时操作的话,一般放在服务里面进行执行。

13、通过RadioGroup的getCheckedRadioButtonId()方法得到的返回值(int)是RadioButton的id值。
14、设置当listview没有数据显示的时候,应该显示什么样的view对象mListView.setEmptyView(mEmpty);
15、在进行电话拦截的时候,用的是不是广播接收者,而是,电话的管理者
16、在ListView中如果需要分割线,那么就是用divider属性,就可以设置,可以用一张图片在做,也可以用一个颜色来做。但是需要注意的是,当设置的是颜色的时候,必须设置颜色的高度(通过dividerHeight这个属性来设置,单位为dp),因为颜色是没有高度的,用图片充当的时候就不用设置高度,以为图片本身就有一个高度。
17、可以通过一个控件的getWindow()方法得到自己所在的窗口的对象,通过这个对象可以得到自己在这个窗口中的属性对象(getAttribute()),得到了属性的对象(params)后,就可以通过属性的对象设置一些新的属性给自己,然后最后要注意的是,设置完成以后必须要再将这个属性对象设置给我们的窗口对象(setAttribute(params))。
18、在自定义一个Dialog(弹窗)的时候,我们可以自定义它的样式,自定义它的视图,我们继承Dialog类以后,里面有一个非常特殊的方法,onCreate()重载方法,里面有一个setContentview的方法,这里这个方法和Activity里面的那个。。。。。非常相似了,就是为自己加载一个布局样式,这样我们就在我们的弹窗中自定义出自己想要的风格,需要注意的是当我们使用自定义的Dialog主题样式的时候,我们在两个参数的构造函数里面设置主题,当设置了自己所需要的主题时,如果不引用系统自带的主题的话,会导致我们的自定义Dialog全屏,这并不是我们想看到的,所以这里我们必须通过在自定义的属性的标签里面用parent这个关键字(parent:"[系统的主题]"),来引用我们系统的Dialog主题,相当于我们只是覆盖了部分的主题。,而一些关键的主题风格还是用的系统的样式。
19、在安卓中有两个定义样式的文件一个是style文件,一个是theme文件,他们有什么区别呢?style文件主要是用来设置控件的样式的,而theme主要是用来设置空间的主题的。大体方向上是属于一类东西,但是在细节上还是有区别的。
20、当我们 拷贝了一些系统的主题样式来使用的时候,一些属性的开头没有加命名控件(Android:),如果我们不加的话,可能会报错,所以拷贝系统的风格样式来用的时候,我们一般都要在没有加命名空间的位置加上(Android:)。
21、当listView中有固定的条目类型时,不需要复用,那么就需要将服用的代码提取到需要服用的条目加载的里面,要不然会出现空指针异常。

22、怎么在谷歌提供的API demos里面找到我们想要的动画效果并抄袭复用?先看你需要的那个效果的界面上有什么关键字,然后可以在.XML文件中搜索那个关键字找到string.xml文件,然后看哪个布局文件里面引用了这个关键字,就好到了界面的布局,找到布局以后,就在.JAVA文件中搜索,看哪个文件加载了这个布局,然后分析,那个效果是哪个控件触发的,就去找那个控件的监听事件,然后代码改一改,缺插补器的话找一找,然后你懂得!
23、在ListView中如果存在CheckBox的话,如果用盒子(Holder),对View进行复用的话,其选中状态也会跟着复用,解决的办法就是,让它不可点击,不可存在焦点,把每个条目是否选中的信息存在BEAN中,然后调用NotifydataSetChange方法(调用这个方法会回调适配器中的GetCount和GetView这两个方法),然后在适配器中用代码手动的设置相应的条目是否选中。
24、当一个控件遮挡了另外的View的时候,如果后面的View有点击事件,那么,我们点击我们上方控件

的时候,就会影响到 下面的View的点击事件,所以,一般我们都要屏蔽了下方View的点击事件,做法就
是在我们的上方控件里面设置Clickable属性为真。
25、远程布局无法findViewById(),用里面提供的方法来设置里面的控件属性。
26、不仅仅字符串可以进行国际化,图片也可以进行国际化。
27、当一个模块需要另外一个模块提供数据的时候,为了降低耦合我们采取回调的方式进行数据传递。
在需要数据的模块内实现一个接口并实现方法,然后把接口对象传递给提供数据的模块,提供数据的模
块只需要将数据放在接口的方法参数中,就相当于调用了实现方法,实现了相应的需求。
28、异步加载不能取消,只能设置标示(cancle(true)),在各个方法中获取标示来判断然后屏蔽以
前执行的代码,来让异步不执行代码了,只是一个伪取消操作。
29、安卓中,不允许单个的应用程序清理其他程序的缓存,一键清理其实是使用了安卓的一个BUG来实现
的。用包管理者里面的freestorageAndnotify方法来清除数据,利用的是安卓中如果请求的空间大小大
于总大小的话,就会清空已用空间,这个方法需要利用反射来做,并且需要加上清除APP缓存的权限。
30、所有的aidl操作都是在子线程中进行的,因为aidl操作一般都是耗时操作。
31、包管理者,可以通过一个包名,得到打开这个应用程序的意图对象。
32、在安卓打包混淆的时候,自定义控件混淆不了,四大组件也混淆不了。因为安卓系统在找的时候,混淆了就找不到。
33、与ROOT相关的一个可执行文件在system目录下的xbin文件夹里面,叫做su。只要放在这个指定目录获取了ROOT权限,但是需要注意的是,现在很多的定制系统有的屏蔽或者改变了这个可执行文件的位置。这样就可以去通过执行这个文件,判断手机是否ROOT了,执行失败说明没有ROOT。
34、ListView的条目中如果有可以执行点击事件的控件的话,会抢夺条目的点击事件,如果需要分开处理点击事件,必须设置一下,条目的容器属性(后裔事件),descendantfocusability属性,选择不同的处理方式。
35、ListView默认的上下边缘有一个衰弱的颜色效果,如果要取消的话,可以设置其fadingedgelength属性,英文翻译(衰弱边缘长度)。与这个属性类似的还有一个条目之间的分割线的长度dividelength属性(设置分割线的高度)。
36、自定义控件时,如果是在主线程中用invalidate,在子线程中用postinvalidata,这两个方法可以回调onDraw方法或者ComputeScroll方法,区别在于,如果继承的是View就调用前者,如果是继承的是ViewGroup就调用后者。
37、在使用ViewPager(V4包)时,继承适配器时,要手动添加两个必要的实现方法,注意!是手动添加,我至今不明白为什么这样的必须实现的两个方法,为什么不定义为抽象方法,这是我对谷歌工程师很不解的一点,不过记住就好,一个是instantiateItem,一个是destroyItem方法。并且在instantiateItem中,得到一个子View的引用后并不能像ListView的适配器一样直接返回,而是要手动的用addView方法添加,并且,这里这个方法的返回值变成了缓存View的对象(在ViewPager里最多有三缓存对象,左右最多各一个,当滑动时,如果左右超出了相邻位置后,会从缓存中删掉那个条目)。
38、ListView的条目中存在可以点击的控件时,会抢夺条目本身的点击事件,如果不希望这样,需要在条目的布局的根布局中添加adescendantFocusability属性,属性值设置为blockDescendants,这个属性的名字叫做后裔事件处理,其实就是设置怎么处理孩子与自己冲突的事件。
39、当一个控件还没有完全布局到界面上时,不能调用getWidth这样的方法得到控件的宽高,因为这个方法只有当活动的onCreate方法执行完以后,才有值,在还没有使用某个布局或者控件的时候,如果想的到其宽高,只能通过测量后,得到一个测量的宽度。
40、在设置一个View隐藏时,一种是View.GONE,一种是View.INVISIBLE,两种方法都可以隐藏,但是又有小小的区别,前者隐藏后,连布局本身都没有了,可能会影响到父布局,比如父布局的高设置为包裹内容,那么就撑不起来了!后者隐藏后布局本身还在,还能为父布局撑起来。
【安卓、常见错误、规整】41、在继承ViewGroup来做自定义控件时,为子孩子设置布局时,设置的是子孩子的左上角,右下角的坐标。这一点和其他地方有一些区别,需要特殊记忆。

    推荐阅读