万丈红尘千杯酒,
千秋霸业一壶茶。
用 Activity A 去启动一个 Translucent Activity B,那么 Activity A 将不会调用 onStop 方法,因为 onStart 与 onStop 对应于 visible lifetime。只有当 Activity 不可见时,onStop才会调用。
开始学习 Cocos2d-x:
Touch事件的不同坐标系位置获取:
自定义 View 在定义 attr 时需要注意: attr 的 name 不能是系统已有的,也不能是第三方库已经定义的,也不能是项目已经定义了的。推荐加上前缀来避免冲突。
RecylerView 使用 LinearLayoutManager 时,需要注意 LinearLayoutManager 的 generateDefaultLayoutParams() 默认返回的宽高都是 WRAP_CONTENT,如果我们希望 orientation 为 VERTICAL 且 子元素 宽度 MATCH_PARENT 时,我们需要重写 generateDefaultLayoutParams() 来达到目的。
如果服务器的内存很小,经常会出现一些操作由于内存不足而被 kill 掉,这个时候我们可以添加 swap 来用硬盘空间代替内存空间,Centos 7的操作:
clipToPadding 和 clipChildren 是我们经常用于更改 View 绘制区域的手段,但这二者的作用点并不相同,要注意区分:
clipToPadding 在 ListView 等滚动容器能满足“默认存在padding, 而滚动时没有padding”的视觉效果。
clipChildren 经常用于 ViewGroup 的子元素的子元素需要扩大其绘制范围的情况(作用目标和 setClipChildren 的 View 跨级)。
Android 开发中,每个界面(Activity 或 Fragment)的 View 的 id 应当避免重复(像 ListView 的 itemView 这种原本就带有复用机制的View除外)。因为 View 状态的保存与恢复与 id 息息相关, 如果一个界面有多个相同的id, 在状态恢复时可能出错。详情请看: android中正确保存view的状态
一般情况下,我们不会去可以制造 id 重复的情况,但如果我们同一个界面使用了很多相同的组件,而这个组件内部有定义 id, 就有可能造成这种 View 状态混乱的情况
Android View 在使用 LayoutParam 时,需要根据其父 View 而使用相应的 LayoutParam,Android 5.0 以后有了较大的容错性,即使 LayoutParam 错误也不会有什么问题,但在 4.x 的手机上就会 crash。开发过程中需要注意,开发结束后也应当使用 4.x 的手机多验证验证。
Android Studio 以及很多编辑器编辑区域右边都会有一条细线,这条线叫“右边界限”,是为了确保阅读体验而建议的每一行代码的最大宽度。
android中资源访问有两个符合:“@” 和 “?”:
@:如@color、@string、@drawable,表示去取已经定义好的资源
?:?attr,表示去对应的 theme 中获取相应的资源,不同的 actvitiy 可以有不同的 theme, 因此取出来的值就可以不一样。
一篇很好的来理解 frame 和 bounds 的文章:
Git Subtree教程:
Android 冷启动白屏的原因和解决方案:
原因:当系统启动应用的 Activity 时,如果该Activity所属的Application还没有启动,那么系统会为这个Activity创建一个进程,进程创建完成后,Activity 才会继续自己的流程,由于创建进程需要花费时间,WindowManager会先加载APP里的主题样式里的窗口背景(windowBackground)作为预览元素。
解决方案:
方法一:设置窗口背景(windowBackground)为一张图片作为欢迎页。
方案二:设置第一个 Activity 为透明Activity, 再由第一个 Activity 启动业务 Activity,这样用户最开始看到的将依旧是桌面。
ListView 的 getView 在每个 item 进入屏幕前都会调用,但 RecyclerView 的 onBindViewHolder 的调用与是否进入屏幕无关。如果在 RecyclerView 中想根据是否进入屏幕来做某些操作的话,应该调用 onViewAttachedToWindow 和 onViewDetachedFromWindow。
Android Studio 可以帮我们从 layout 中快速抽取公共样式,唯一可惜的是公共样式存在的文件(styles.xml)不能自定义:
Android Studio中,成员变量前加“m”,静态变量前加“s”,而 Android Studio 自动生成的 get/set 方法不会夹杂“m”和“s”的设置方法为:
写代码常常需要常常格式化:
代码格式化:Command + Option + L | Control + Alt + L
无用import清理:Control + Option + O | Control + Alt + O
Android Studio 格式化时注解不换行的设置方法:
在使用 ImageSpan 或 调用 Drawable.draw(Canvas) 等场景下, 我们必须手动调用 Drawable.setBounds() 来确定 drawable 的 bounds。
虽然我们可以通过 Drawable.getIntrinsicWidth() 和 Drawable.getIntrinsicHeight() 来获取其真实的宽高,但其 bounds 默认并不是 (0, 0, Drawable.getIntrinsicWidth(), Drawable.getIntrinsicHeight());
如果你发现你的 ImageSpan 不显示,或者 Drawable.draw(Canvas) 没有任何效果,那多半是因为你忘记调用 Drawable.setBounds() 了。
Android 中 ViewPager 所使用的 PageAdapter 的 getCount 返回值不能为 Integer.MAX_VALUE,也应当避免其值过大,因为其值越大,ViewPager.populate() 所耗费的时间越久,如果为 Integer.MAX_VALUE, 基本上陷入死循环而出现 ANR 了。
Android 中 View 的 setBackground 系列操作会使得 View 的 padding 变为 0,因此在 setBackground 前要想清楚是否需要先用临时变量 padding 给保存起来,之后再还原回去。
Android 很多地方用到了Gravity,并且是可以通过位运算叠加效果,例如 Gravity.Left | Gravity.Top,但是当我们需要判断变量 gravity 的值时,我们不能简单的通过 & 操作,而先要用 Gravity.HORIZONTAL_GRAVITY_MASK 或者 Gravity.VERTICAL_GRAVITY_MASK 进行mask
错误:(gravity & Gravity.Left) == Gravity.Left
正确:int horGravity = gravity & Gravity.HORIZONTAL_GRAVITY_MASK; (horGravity & Gravity.Left) == Gravity.Left