android 实用知识点

此篇文章为记录我android开发工作中使用一些小功能或小技巧,相信总会有你需要的。不定时更新。。。。

动态改变EditText的输入内容

mIdentificationEt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                String str = s.toString();
                if (str != null && !TextUtils.isEmpty(str)) {
                    char lastChar = str.charAt(str.length() - 1);//获取最后一个字符
                    if (Character.isLowerCase(lastChar)) {//判断是否是小写
                        mIdentificationEt.setText(str.toUpperCase());//小写变大写,并重新赋值
                        mIdentificationEt.setSelection(str.length());//将光标移至末尾
                    }
                }
            }
        });

改变icon的颜色

很多时候我们会遇到这样的情况:手里一个icon图标,可能只是黑色的,但需要显示成别的颜色,或者同一个图标需要显示好几种颜色。
这种时候其实不需要美工帮我们切图,只要在代码中这样处理就能显示对应的颜色:

mIvIcon.setColorFilter(mContext.getResources().getColor(R.color.red));

setTextSize()

使用如下代码时,发现字号不会变大,反而会变小:

size = (int) mText.getTextSize() + 1;
mText.setTextSize(size);

后来发现getTextSize返回值是以像素(px)为单位的,而setTextSize()是以sp为单位的,两者单位不一致才造成这样的结果。

这里可以用setTextSize()的另外一种形式,可以指定单位:

setTextSize(int unit, int size)
TypedValue.COMPLEX_UNIT_PX : Pixels
TypedValue.COMPLEX_UNIT_SP : Scaled Pixels
TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels

下面这样就正常了:

size = (int) mText.getTextSize() + 1;
mText.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);

附送px、sp、dp转换工具:

public class DisplayUtil { 
        /**
         * 将px值转换为dip或dp值,保证尺寸大小不变
         * 
         * @param pxValue
         * @param scale
         *            (DisplayMetrics类中属性density)
         * @return
         */ 
        public static int px2dip(Context context, float pxValue) { 
            final float scale = context.getResources().getDisplayMetrics().density; 
            return (int) (pxValue / scale + 0.5f); 
        } 

        /**
         * 将dip或dp值转换为px值,保证尺寸大小不变
         * 
         * @param dipValue
         * @param scale
         *            (DisplayMetrics类中属性density)
         * @return
         */ 
        public static int dip2px(Context context, float dipValue) { 
            final float scale = context.getResources().getDisplayMetrics().density; 
            return (int) (dipValue * scale + 0.5f); 
        } 

        /**
         * 将px值转换为sp值,保证文字大小不变
         * 
         * @param pxValue
         * @param fontScale
         *            (DisplayMetrics类中属性scaledDensity)
         * @return
         */ 
        public static int px2sp(Context context, float pxValue) { 
            final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; 
            return (int) (pxValue / fontScale + 0.5f); 
        } 

        /**
         * 将sp值转换为px值,保证文字大小不变
         * 
         * @param spValue
         * @param fontScale
         *            (DisplayMetrics类中属性scaledDensity)
         * @return
         */ 
        public static int sp2px(Context context, float spValue) { 
            final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; 
            return (int) (spValue * fontScale + 0.5f); 
        } 
    }

动画版本适配

大家都知道属性动画animator是在android3.0添加的一种新的动画,与之前的animation的区别在于:animation改变的仅仅是视图,view本身的属性,所在位置(触发点击事件的区域)等都没有发生变化,而animator改变时view的属性,因此点击事件会随着view的移动而移动。
目前的统计数据都表明3.0以下的系统在市场上已是凤毛麟角了,因此在开发中都会都是使用属性动画(毕竟是如此的强大)。但是工作中发现酷派手机 android系统版本显示为:4.4,却无法正常显示属性动画,通过实验,最大的可能是系统的api被修改而无法正常实现属性动画效果。
解决方案:使用Jake Wharton大神的nineoldandroids开源库,可以将属性动画兼容至3.0以下。
说了那么多,就是想表达动画的版本适配还是要多加注意的,毕竟国产手机那么多,而android又是一个开源的,可能会出现系统缺陷而导致application层出现奇怪的问题。

style设置背景图片

当某一个activity需要一个背景图片时,是不是首先想到的是在xml文件中设置?其实作为activity(整个界面)的背景图片也可以通过style来设置的:

<style name="LodingActivityTheme" parent="android:Theme.NoTitleBar.Fullscreen">
        <item name="android:windowBackground">@drawable/loading_backgroud</item>
    </style>

这样的话这张图片就可以作为背景图片显示啦~

但是要注意,这样设置的图片是和设置背景一样,scaleType是fitXY。如果需要改变scaleType的话就无法使用这种方式。

TextView 如何判断是否已经省略

通过textview获取Layout,然后根据Layout的一个方法getEllipsisCount(int),来判断是否已经省略,但Layout大多时候获取到的都是null,为什么呢?原因是,Layout要等TextView绘制完了才能够拿到Layout的对象。

final TextView textView = (TextView) findViewById(R.id.txt_training_introduce);
        textView.post(new Runnable() {
            @Override
            public void run() {
                Layout l = textView.getLayout();
                if (l != null) {
                    int lines = l.getLineCount();
                    LogUtils.d(TAG, "lines = " + lines);
                    if (lines > 0) {
                        if (l.getEllipsisCount(lines - 1) > 0) {
                            LogUtils.d(TAG, "Text is ellipsized");
                        }
                    }
                } else {
                    LogUtils.d(TAG, "Layout is null");
                }
            }
        });

使用IconFont

IconFont本质是一种特殊字符,可以看作一种text,因此在android中我们用textview来呈现它。
Iconfont的优点:
(1) 轻松解决图标资源适配问题,无论什么分辨率,图片都是超级清晰的
(2) 轻松改变颜色,大小,背景,圆角,轮廓各种属性
(3) apk大小,小,小,小
(4) 可实现跨平台,一套资源,web,ios,android都能用
(5) 资源维护很方便
缺点:
需要自定义svg图片,并将其转换为ttf文件,图标制作成本比较高

初步使用流程
1.导入字体文件
在工程 assets 或者res/raw目录下放入“.ttf”结尾字体文件,如:iconfont.ttf。
2.使用字体
打开工程目录下 res/values/strings.xml 文件,添加 string

<string name="icons">&#xe79d;</string>

然后打开 Activity 对应的布局文件,比如activity_main.xml,添加 string 值到 TextView 中

<TextView
android:id="@+id/like"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/icons" />

3.最后,为 TextView 指定字体

import android.graphics.Typeface;
...
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 加载布局文件
    setContentView(R.layout.activity_main);
    // 加载字体文件
    Typeface iconfont = Typeface.createFromAsset(getAssets(), "iconfont.ttf");
    // 获取 textview 实例
    TextView textview = (TextView)findViewById(R.id.like);
    // 设置 typeface, 就是字体文件
    textview.setTypeface(iconfont);
}
...

需要注意,如果icon文本是通过代码动态set的话


setText("\ue79d");// "&#x" 替换成 "\u",用 unicode 字符来表示

详情数据bean优化

项目中经常会出现这种情况:有一个列表页,点击某一个条目会进入详情页,如果详情的数据非常多,或者网络情况不太好的时,用户就会花很久的时间来等待数据显示。

推荐一种优化的思路:其实列表页一般会包含详情的主要数据,例如title之类的,我们在点击详情页的时候可以将这个列表页对应的数据bean传给详情页,这样详情页可以先显示一些主要的数据,同时加载其他的细节数据,加载完成后在显示出来,这样用户在进入详情页时不会只看到一个空白的页面。

图片在不同drawable的影响

我们都知道android有屏幕适配,在项目中会有drawable-mdpi、drawable-xhdpi等等不同的drawable目录,当app运行在手机中时,会根据当前手机的屏幕自动去对应的drawable目录下取图片,没有找到时在去其他drawable寻找。这里是不是有人认为:如果只有一张图片,那我随便放一个drawable里就可以了。
其实同一张图片放在不同的drawable目录下是会有影响的,具体的影响可以参见:
关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析
总结来说,android屏幕适配只需要一套图片即可,但要根据图片的分辨率放到对应的drawable目录下才行。

查看当前项目的引用库情况

在Android studio Terminal输入如下命令:

gradlew -q app:dependencies 

日期计算之Canender,Date

Android中Calendar类的用法总结
Java 的开发过程中免不了与 Date 类型

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值