Android 之小技巧

小技巧,不足为专题内容

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一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值