# Android-useful-skill **Repository Path**: f059074251/Android-useful-skill ## Basic Information - **Project Name**: Android-useful-skill - **Description**: Android开发中一些被冷落但却很有用的类和方法 - **Primary Language**: Android - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2016-02-17 - **Last Updated**: 2025-01-08 ## Categories & Tags **Categories**: android-modules **Tags**: None ## README Android-useful-skill ==================== Java相关 -------- ### SparseArray > Map的高效优化版本。推荐了解姐妹类SparseBooleanArray、SparseIntArray和SparseLongArray。 ### ArrayMap > 比 HashMap 更高的内存效率,但比 HashMap 慢,不适合有大量数据的场景。 ### SortedList > v7 包中,见名知意 ### java8中新增的LocalDate和LocalTime接口,Date虽然是个万能接口,但是它真的不好用,有了这俩,终于可以愉快的处理日期时间了。 工具类 ------ ### ThumbnailUtils > 帮助创建缩略图。通常我都是用现有的图片加载库(比如,Picasso 或者 Volley),不过这个ThumbnaiUtils可以创建视频缩略图。译者注:该API从V8才开始支持。 ### MediaMetadataRetriever > 顾名思义,就是用来获取媒体文件一些相关信息的类。包括一首歌的标题,作者,专辑封面和名称,时长,比特率等等。如果是视频的话,可以获取视频的长宽,预览图。 > http://developer.android.com/intl/zh-cn/reference/android/media/MediaMetadataRetriever.html ### Formatter.formatFileSize > 根据文件大小自动转为以KB, MB, GB为单位的工具类。想想以前都是自己计算的… > http://developer.android.com/intl/zh-cn/reference/android/text/format/Formatter.html ### Log.getStackTraceString() > 方便的日志类工具,方法Log.v()、Log.d()、Log.i()、Log.w()和Log.e()都是将信息打印到LogCat中,有时候需要将出错的信息插入到数据库或一个自定义的日志文件中,那么这种情况就需要将出错的信息以字符串的形式返回来,也就是使用static String getStackTraceString(Throwable tr)方法的时候。 ### PhoneNumberUtils.convertKeypadLettersToDigits > 顾名思义.将字母转换为数字,类似于T9输入法, ### DateUtils.formatDateTime() > 用来进行区域格式化工作,输出格式化和本地化的时间或者日期。 ### Pair.create() > 方便构建类和构造器的方法。 > > 可以方便的用来存储一"组"数据。注意不是key value ### UrlQuerySanitizer > 使用这个工具可以方便对 URL 进行检查。 ### PhoneNumberUtils.formatNumber () > 顾名思义,这是对数字进行格式化操作的时候用的。 ### Context.getCacheDir() > 获取缓存数据文件夹的路径,很简单但是知道的人不多,这个路径通常在SD卡上(这里的SD卡指的是广义上的SD卡,包括外部存储和内部存储)Adnroid/data/您的应用程序包名/cache/ 下面.测试的时候,可以去这里面看是否缓存成功.缓存在这里的好处是:不用自己再去手动创建文件夹,不用担心用户把自己创建的文件夹删掉,在应用程序卸载的时候,这里会被清空,使用第三方的清理工具的时候,这里也会被清空。 ### Context.getExternalFilesDir() > 申请了SD卡写权限后,你可以在SD的任何地方写数据,把你的数据写在设计好的合适位置会更加有礼貌。这样数据可以及时被清理,也会有更好的用户体验。此外,Android 4.0 Kitkat中在这个文件夹下写数据是不需要权限的,每个用户有自己的独立的数据存储路径。译者注:该API从V8才开始支持。 ### Environment.getExternalStoragePublicDirectory() > 还是那句话,用户期望在SD卡上得到统一的用户体验。用这个方法可以获得在用户设备上放置指定类型文件(音乐、图片等)的正确目录。 ### AlphabetIndexer > 字母索引辅助类 系统相关 -------- ### Genymotion > 个非常快的 Android 模拟器,本人一直在用。 ### LocalBroadcastManager > 用于在APP内部使用的,效率和安全性更好的广播工具类。 > http://developer.android.com/intl/zh-cn/reference/android/support/v4/content/LocalBroadcastManager.html ### Messenger > 进程间通信的一个工具类。内部也是由AIDL实现的,但是用起来超级方便。 > http://developer.android.com/intl/zh-cn/reference/android/os/Messenger.html > http://blog.csdn.net/lmj623565791/article/details/47017485 ### ViewConfiguration.getScaledTouchSlop() > 使用 ViewConfiguration 中提供的值以保证所有触摸的交互都是统一的。这个方法获取的值表示:用户的手滑动这个距离后,才判定为正在进行滑动.当然这个值也可以自己来决定.但是为了一致性,还是使用标准的值较好。 ### ActivityManager.getMemoryClass() > 告诉你你的机器还有多少内存,在计算缓存大小的时候会比较有用。 ### SystemClock.sleep() > 这个方法在保证一定时间的 sleep 时很方便,通常我用来进行 debug 和模拟网络延时。 ### BroadcastRecevier.setDebugUnregister () > 又一个方便的调试工具。 ### PackageManager.setComponentEnabledSetting() > 可以用来启动或者禁用程序清单中的组件。对于关闭不需要的功能组件是非常赞的,比如关掉一个当前不用的广播接收器。 ### HandlerThread > 代替不停new Thread开子线程的重复体力写法。 ### IntentService > 一个可以干完活后自己去死且不需要我们去管理子线程的Service。 ### AccessibilityService > 由于强大所以需要手动设置来启用,各种消息获取各种状态拦截,豌豆荚就用ta实现了非root自动安装。 Activity相关 ------------ ### Activity.recreate > 重新创建Activity。有什么用呢?可以在程序更换主题后,立马刷新当前Activity,而不会有明显的重启Activity的动画。 > http://developer.android.com/intl/zh-cn/reference/android/app/Activity.html#recreate%28%29 ### Activity.startActivities() > 常用于在应用程序中间启动其他的Activity。 ### Context.createConfigurationContext() > 自定义你的配置环境信息。我通常会遇到这样的问题:强制让一部分显示在某个特定的环境下(倒不是我一直这样瞎整,说来话长,你很难理解)。用这个实现起来可以稍微简单一点。 ### ActivityManager.clearApplicationUserData() > 键清理你的app产生的用户数据,可能是做用户退出登录功能,有史以来最简单的方式了。 ### ActivityOptions > 方便的定义两个Activity切换的动画。 使用ActivityOptionsCompat 可以很好解决旧版本的兼容问题。 Fragment相关 ------------ ### Fragment.setUserVisibleHint > Fragment可以重写此方法,然后根据参数的布尔值(true的话表示当前Fragment对用户可见),来执行一些逻辑。 > http://developer.android.com/intl/zh-cn/reference/android/support/v4/app/Fragment.html#setUserVisibleHint(boolean) ### DialogFragment.setShowsDialog () > 这是一个很巧妙的方式,DialogFragment 可以作为正常的 Fragment 显示!这里可以让 Fragment 承担双重任务。我通常在创建 Fragment 的时候把 onCreateView ()和 onCreateDialog ()都加上,就可以创建一个具有双重目的的 Fragment。 ### FragmentManager.enableDebugLogging () > 在需要观察 Fragment 状态的时候会有帮助。 View相关 -------- ### Linkify.addLinks() > 在Text上添加链接。很实用。 ### StaticLayout > 在自定义 View 中渲染文字的时候很实用。 ### View.getContext > 顾名思义,就不用解释了吧…以前在写RecyclerView的Adapter的时候,为了使用LayoutInflater,经常傻乎乎地在构造函数中传入一个外部的context….是不是只有我不知道而已(笑cry脸) > http://developer.android.com/intl/zh-cn/reference/android/view/View.html#getContext() ### View.post > 方便在非UI线程对界面进行修改,与Handler的作用类似。并且由于post的Runnable会保证在该View绘制完成的前提下才调用,所以一般也可以用于获取View的宽高。 > http://developer.android.com/intl/zh-cn/reference/android/view/View.html#post(java.lang.Runnable) ### TouchDelegate > 用于更改View的触摸区域。场景:比如在RecyclerView的ItemView里包含了CheckBox组件, 然后想实现点击ItemView的时候,也可以触发CheckBox,就可以使用此类。 > http://developer.android.com/intl/zh-cn/training/gestures/viewgroup.html#delegate ### ViewDragHelper > 视图拖动是一个比较复杂的问题。这个类可以帮助解决不少问题。如果你需要一个例子,DrawerLayout就是利用它实现扫滑。Flavient Laurent 还写了一些关于这方面的优秀文章。 > 做过自定义ViewGroup的童鞋都应该知道这个东西吧,用来处理触摸事件的神器,妈妈再也不用担心我自定义控件了。 > http://developer.android.com/intl/zh-cn/reference/android/support/v4/widget/ViewDragHelper.html > http://www.cnblogs.com/lqstayreal/p/4500219.html ### PageTransformer > 用于定义ViewPager页面切换时的动画效果(淡入淡出,放大缩小神马的…)官方有例子,直接看吧。 > http://developer.android.com/intl/zh-cn/training/animation/screen-slide.html ### ValueAnimator.reverse() > 这个方法可以很顺利地取消正在运行的动画。 ### View.generateViewId() > 每次我都想要推荐动态生成控件的ID。需要注意的是,不要和已经存在的控件ID或者其他已经生成的控件ID重复。 ### getParent().requestDisallowInterceptTouchEvent(true) > 剥夺父view对touch事件的处理权,谁用谁知道。 ### Canvas中clipRect、clipPath和clipRegion剪切区域的API。 ### AutoScrollHelper > 在可滚动视图中长按边缘实现滚动,Android View.OnTouchListener 的子类。 TextView相关 ------------ ### EditText.setImeOptions > 使用EditText弹出软键盘时,修改回车键的显示内容(一直很讨厌用回车键来交互,所以之前一直不知道这玩意儿) > > android:imeOptions="" > > 举几个例子分别代表的含义: > > actionSearch: 搜索 > > actionSend: 发送 > > actionNext: 下一项 ### TextView.setError() > 用于验证用户输入。 布局属性 -------- ### android:animateLayoutChanges > 这是一个非常酷炫的属性。在父布局加上 android:animateLayoutChanges="true" 后,支持通过setLayoutTransition()自定义动画。如果触发了layout方法(比如它的子View设置为GONE),系统就会自动帮你加上布局改变时的动画特效!! > http://developer.android.com/intl/zh-cn/training/animation/layout.html ### android:clipToPadding > clipToPadding就是说控件的绘制区域是否在padding里面的,true的情况下如果你设置了padding那么绘制的区域就往里缩。举个实际场景吧:假如有个ListView,我们想要在初始位置时,第一项Item离顶部有10dp的距离,就可以在ListView的布局中加入android:clipToPadding="false" android:paddingTop="10dp"即可。是不是很方便呢? > http://developer.android.com/intl/zh-cn/reference/android/view/ViewGroup.html#attr_android:clipToPadding ### android:clipChildren (ViewGroup) > 如果此属性设置为不可用,那么ViewGroup的子View在绘制的时候会超出它的范围,在做动画的时候需要用到。 ### android:tileMode (BitmapDrawable) > 可以指定图片使用重复填充的模式。 > > \ ### android:enterFadeDuration/android:exitFadeDuration (Drawables) > 此属性在 Drawable 具有多种状态的时候,可以定义它展示前的淡入淡出效果。 ### -nodpi > 在没有特别定义的情况下,很多修饰符(-mdpi,-hdpi,-xdpi等等)都会默认自动缩放 assets/dimensions,有时候我们需要保持显示一致,这种情况下就可以使用 -nodpi。 > 把一些不能被拉伸的图片放在 drawable-nodpi 中,此图片将不会被放大,以原大小显示。 > 这两个图片被放到了drawable-nodpi 中 > 在不同分辨率下的显示大小是一样的,不会被拉伸,保证了图片的美观。 > 但是宽和高要写wrap_content,不要写dip ### Merge > 此标签可以在另一个布局文件中包含别的布局文件,而不用再新建一个 ViewGroup,对于自定义 ViewGroup 的时候也需要用到;可以通过载入一个带有标签的布局文件来自动定义它的子部件。 ### android:descendantFocusability > ListView的item中CheckBox等元素抢焦点导致item点击事件无法响应时,除了给对应的元素设置 focusable,更简单的是在item根布局加上android:descendantFocusability=”blocksDescendants” ### android:duplicateParentState="true" > 让子View跟随其Parent的状态,如pressed等。常见的使用场景是某些时候一个按钮很小,我们想要扩大其点击区域的时候通常会再给其包裹一层布局,将点击事件写到Parent上,这时候如果希望被包裹按钮的点击效果对应的Selector继续生效的话,这时候duplicateParentState就派上用场了。 > 属性的值有三种: > > beforeDescendants:viewgroup会优先其子类控件而获取到焦点 > > afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点 > > blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点 ### includeFontPadding="false" > TextView默认上下是有一定的padding的,有时候我们可能不需要上下这部分留白,加上它即可。 颜色 -------- ### Bitmap.extractAlpha () > 返回一个新的Bitmap,capture原始图片的alpha值。有的时候我们需要动态的修改一个元素的背景图片又不希望使用多张图片的时候,通过这个方法,结合Canvas和Paint可以动态的修改一个纯色Bitmap的颜色。 ### Palette > 用于提取一张图片的颜色。 > http://developer.android.com/intl/zh-cn/reference/android/support/v7/graphics/Palette.html ### ArgbEvaluator > ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue);用于计算不同颜色值之间的插值,配合ValueAnimator.ofObject或者ViewPager.PageTransformer使用,可以实现不同颜色之间的平滑过渡。 > > 用于根据一个起始颜色值和一个结束颜色值以及一个偏移量生成一个新的颜色,分分钟实现类似于微信底部栏滑动颜色渐变。 > http://developer.android.com/intl/zh-cn/reference/android/animation/ArgbEvaluator.html 数据库 ------ ### CursorJoiner > 如果你是只使用一个数据库的话,使用 SQL 中的 join 就可以了,但是如果收到的数据是来自两个独立的 ContentProvider,那么 CursorJoiner 就很实用了。 ### DatabaseUtils > 个包含各种数据库操作的使用工具。 ### SQLiteDatabase.yieldIfContendedSafely() > 让你暂时停止一个数据库事务, 这样你可以就不会占用太多的系统资源。 控件 ---- ### Space > space是Android 4.0中新增的一个控件,它实际上可以用来分隔不同的控件,其中形成一个空白的区域.这是一个轻量级的视图组件,它可以跳过Draw,对于需要占位符的任何场景来说都是很棒的。