小技巧,不足为专题内容
TextView的drawableLeft与文本一起居中显示
原始的TextView设置了LeftDrawable后,如果TextView的宽度是MATCH_PARENT,LeftDrawable是无法和TextView中的text一起居中的,而是在左边。
参见 http://www.cnblogs.com/over140/p/3464348.html
请注意这个时候设置TextView的Gravity为CENTER_VERTICAL,因为下面链接中提到的自定义组件其实就是将画布开始draw的位置向中间移动了(业绩leftDrawable和text一起从中间开始draw)。如果textView被设置为横向居中,那么最后结果textView会跑到右边。
添加子view到LinerLayout中,子view的layout参数被去掉了。
使用addView(View view ,index ,LayoutParams) 来重新设置子view在父布局中的布局参数。
什么条件下使用layer-list
故名思意,多图层表。
使用场景:
- 需要多个图片资源进行重叠
- 需要有padding的分割线。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="8.8dp"
android:top="8.8dp">
<shape android:shape="rectangle">
<solid android:color="@color/hotel_flight_divider_color"></solid>
<size
android:width="1dp"
android:height="1dp"></size>
</shape>
</item>
</layer-list>
实现:
可以不用 Context 也能获取屏幕密度
1.Resources.getSystem().getDisplayMetrics().density 可以不用 Context 也能获取屏幕密度
/**
* Return a global shared Resources object that provides access to only
* system resources (no application resources), and is not configured for
* the current screen (can not use dimension units, does not change based
* on orientation, etc).
*/
public static Resources getSystem() {
synchronized (sSync) {
Resources ret = mSystem;
if (ret == null) {
ret = new Resources();
mSystem = ret;
}
return ret;
}
}
为java中创建的view设置资源id
2.new 出来的 View 可以用 View.generateViewId() 生成 id,系统保证唯一。
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
public static int generateViewId() {
for (;;) {
final int result = sNextGeneratedId.get();
// aapt-generated IDs have the high byte nonzero; clamp to the range under that.
int newValue = result + 1;
if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
if (sNextGeneratedId.compareAndSet(result, newValue)) {
return result;
}
}
}
仅支持api17及以上,17以下将上面的代码拷贝一份到工具类中。
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1){
return Utils.generateViewId(view);
}else{
return view.generateViewId();
}
如果插件化加载中使用aapt动态调整资源的packageId,可能会出问题。因为generateViewId的本质是将package从01开始计数自增,保证和res中的资源id不一样。
当compileSdkVersion和运行机版本不match时如何正确断点
debug低版本源码
比如我现在现在想debug api17的源码,但是工程里配置是compileSdkVersion 23,所以得debug跳到的源码也是api23的,但是又不能改变compileSdkVersion,how to 弄?
1.先编译
2.去sdk的源码sources目录,把17的目录名改成23
mv android-23 23-temp
mv android-17 android-23
3.然后debug就能在17的源码打断点了
clipChildren=”false”
让属性动画穿过布局边界
LinearLayout 分隔线divider
LinearLayout有两个属性
1、android:divider=”@drawable”
2、android:showDividers = “middle|end|beginning|none”
middle 在每一项中间添加分割线
end 在整体的最后一项添加分割线
beginning 在整体的最上方添加分割线
none 无
但是,这种属性只有Android3.0以上才支持。
兼容3.0以下版本,需要引用android-support-v7-appcompat.jar
使用android.support.v7.widget.LinearLayoutCompat,用法和LinearLayout一样