您的位置:首页 > 移动开发 > Android开发

Android 之小技巧

2016-03-23 18:18 495 查看
小技巧,不足为专题内容

TextView的drawableLeft与文本一起居中显示

原始的TextView设置了LeftDrawable后,如果TextView的宽度是MATCH_PARENT,LeftDrawable是无法和TextView中的text一起居中的,而是在左边。

参见 /article/4602874.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一样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: