Android 适配之dimens adapter

序言

大渣好,马上要过春节了,举国同庆的日子,在这里先祝大家:新年快乐,合家欢里,工作顺利,每天都旺、旺、旺!接下来,进入正题,今天我们的主题是适配,我们都知道 Android 屏幕碎片化特别严重,所以我们不止要开发一款好的应用,而且要在各种手机上都保持一样的效果,至少主流机型没问题,这是我们最头疼的问题,总之适配的工作是不可避免的,适配的方式包括很多内容,关于这一块的内容,我们简单聊一下!

适配常识

对于度量单位,有很多形式,android 中提到的类型有:dppspxinchptmm,也就是你可以使用这几种形式的单位,在不同的分辨率下,显示的效果是截然不同的,所以在 Android 中提倡以 dp (与像素无关)来作为统一单位,在实际使用中1dp大约等于1/160 in,而文字统一使用 sp 作为单位,以达到显示的一致性。关于单位的换算,可以看 Android 源码或者百科一下

所以,适配是一个很复杂的工作,简单罗列一下适配的几种形式:

  • 基础适配
    • 使用 dp 而非其他单位
    • 使用 wrap_content, match_parentweight 权重,尽量不写固定尺寸
    • 使用相对布局
    • 配合使用 .9 图片
    • 使用矢量图
  • 资源适配
    • 多套 drawable 资源
    • 多套 layout 资源
    • 多套 values 资源
  • 百分比布局

Android知识点之enum

序言

问题

enum在Android应不应该使用?

解决方案

关于enum,Android Developers中这样一句话:

enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android

就是说enum比静态常量两倍多的内存占用,应该尽量减少使用。当然了,这里说的是减少并不是禁止,要知道,enum的产生,注定其必定有适合的应用场景,而且它带来的代码简洁性和可读性,都是不可小觑的。

所以,如果在不使用enum的情况下是有替代方案的:

  • 使用静态常量的形式替代
  • 使用Typedef Annotations替代

第一种没什么说的,下面就重点说一说第二种,就是通过注解的形式来代替,注解是由 support 包提供的功能,如果使用,需要添加 support 包到module。

Android知识点之Tanlayout

序言

开发过程中多多少少会遇到一些坑,也会留下一些坑,还有一些小的容易忽略的细节,或者从其他大牛那里了解到的知识点,发现了就整理下来,做个备注,如果恰好有人遇到了,拿走别客气。

Tablayout

问题

为什么tablayout的英文(字母)标签名称默认全是大写?

解决方案

tablayout + viewpager + fragment的分页模式很常见了(这只是其中一种),这个不是重点,重点是tablayout的文字属性。

可能你使用tablayout的显示分类都是中文的, 比如:新闻、数码、设计、前端…

不知道你有没有使用过英文或者说字母的标签名称,你可以直接使用Android Studio 创建一个默认的分页的module,默认标题是英文的,所以你可以看到显示出来全部都是大写的,如果正好使用了这样的名称,那么恭喜你,你可以不用往下看了。但是由于我所使用的是首字母大写的形式,所以最后发现是一个属性的问题:textAllCaps

最终的解决方案是,你可以为tablayout自定义一个style,设置textAllCaps属性为false:

Android之应用是否有启动页面(具有CATEGORY_LAUNCHER属性)

序言

最近遇到一个问题,就是判断这个应用是否具有启动页面,即是不是插件或者服务类应用,不需要展示页面的应用。相信开发过Launcher应用的小伙伴肯定知道这个问题怎么解决。很简单,都是细节问题,稍加注意即可,大牛还请绕路。

实战篇

获取所有安装的应用使用这个方法:

public void getInstalledApps(Context context) {
        PackageManager packageManager = context.getPackageManager();
        List<PackageInfo> list = packageManager.getInstalledPackages(packageManager.GET_ACTIVITIES);
        for (PackageInfo p : list) {

            AppInfoEntity infoEntity = new AppInfoEntity();
            infoEntity.setAppName(packageManager.getApplicationLabel(p.applicationInfo).toString());
            infoEntity.setAppIcon(p.applicationInfo.loadIcon(packageManager));
            infoEntity.setAppPkgName(p.applicationInfo.packageName);
            infoEntity.setApkPath(p.applicationInfo.sourceDir);
            File file = new File(p.applicationInfo.sourceDir);
            infoEntity.setAppSize((int) file.length());
            int flags = p.applicationInfo.flags;

            if ((flags & ApplicationInfo.FLAG_SYSTEM) > 0) {
                // 系统应用
            } else {
                // 安装应用
            }
        }
    }

Android判断某个应用是否安装

序言

在应用开过过程中有这样一个场景:判断某个应用是否已经安装了。你一定会说这个有什么难的,是的,这个问题很简单,不为别的,就为记个笔记,大牛勿喷

代码篇

包名检查

public static boolean isInstalled(Context context, String packageName) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(packageName.trim()
                    , PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
            if (packageInfo != null) {
                // 说明某个应用使用了该包名
                return true;
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return false;
        }

        return false;
}
| | 总字数统计:93.5k