当前标签 / Android / 总共94篇

Android 日志记录轻量级框架 Timber

前言

Log 日志在 Android 项目开发中的作用非常重要,但项目越做越大,开发者会面临很多问题,比如管理各种不同的 Log,不同版本控制是否输入 Log 等。Timber 是一个轻量级的第三方库,能够帮助开发者更好的使用 Android Log。

面临问题

  1. 项目使用 Log 规范不统一,例如:关于 okhttp 的实现使用了 Logging Interceptor 输出 log,关于 rxjava 的实现使用了 onError,其他使用了 Android Log 机制。
  2. 项目开发时,为了方便调试,需要输出 Log,但发布后,Log 中包含很多项目相关的信息,如果全部暴露会有安全隐患,但完全删除也不利于发生问题后的查看调试,因此需要一个开关,关闭开关则不能输出 log,打开开关则可以输出 log。

Timber 介绍

Timeber 的使用主要通过添加 Tree 实例,添加 Tree 实例可以通过方法 Timber.plant 完成。实例化 Tree 需要尽量早,推荐在项目 ApplicationonCreate() 方法中完成。其中,DebugTree 自动实例化,是 Timber 中已经实现了 tree 的类,可直接拿来用,并在使用他的类中以类名为其 TAG,但是其他的 Tree 不会自动实例化,需要进行手动实现扩展 Timber.Tree 实现。

阅读更多

一款让你爱不释手的 Fragment 管理框架

前言

最近在项目中用到了一个 Fragment 管理框架,简直是一个牛逼,这个介绍给大家,这款框架让你爱上使用 Fragment,可以让你的 Fragment 像使用 Activity 一样方便管理。使用它绝对可以让你的开发效率大幅度提升,如果再结合 ConstraintLayout 来开发界面的过程简直让你爽的不要不要的。

项目地址:https://github.com/YoKeyword/Fragmentation

演示APK下载:https://www.pgyer.com/fragmentation

特性

  1. 悬浮球/摇一摇实时查看 Fragment 的栈视图,降低开发难度。
  2. 内部队列机制 解决 Fragment 多点触控、事务高频次提交异常等问题。
  3. 增加启动模式、startForResult 等类 Activity 方法。
  4. 类 Android 事件分发机制的 Fragment BACK 键机制:onBackPressedSupport().
  5. 提供 onSupportVisible()、懒加载 onLazyInitView() 等生命周期方法,简化嵌套 Fragment 的开发过程。
  6. 提供 Fragment 转场动画 系列解决方案,动态改变动画。
  7. 提供 Activity 作用域的 EventBus 辅助类,Fragment 通信更简单、独立(需要使用 EventBusActivityScope 库)。
  8. 支持 SwipeBack 滑动边缘退出(需要使用 Fragmentation_SwipeBack 库)。

阅读更多

HandlerThread详解

概述

在日常开发中,我们经常会通过 new Thread(){}.start(); 的方式来开辟一个新的线程。但是如果我们想要多次执行任务的时候,通过这种方式我就会创建多个线程,这样会使我们的程序运行起来越来越慢。通常情况下我会采用 HandlerThread 的方式来开辟一个线程,那么 HandlerThread 是什么呢?今天我们来介绍一下 HandlerThread。

正文

HandlerThread 是 Thread 的一个子类,HandlerThread 自带 Looper 使他可以通过消息队列来重复使用当前线程,节省系统资源开销。这是它的优点也是缺点,每一个任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会导致后续的任务都会被延迟处理。它的使用也比较简单。

HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();

mHandler = new Handler(thread.getLooper());
mHandler.post(new Runnable(){
    //...
});

接下来我们写一个完整的 Demo,然后在分析一下它的实现原理。

阅读更多

Android 中更为精细的屏幕适配方案

系统 dp 适配存在的问题

做 Android 开发的朋友应该都知道,Android 中屏幕的碎片化问题很严重,为此 Google 提供了 dp 这个单位来适配不同的屏幕。

相同大小的两个屏幕可能具有不同的像素数

从上图我们可以看出来,对于不同屏幕分辨率(像素多少)我们不能使用像素 px 作为单位,而应该使用一种和屏幕密度相关的单位 dp 来表示,最后在绘制的时候转换成 px。

px = dp * (dpi / 160)

阅读更多

如何在 Android 中获取 Heap Dumps

Heap Dumps 是诊断内存相关问题(如内存泄漏、垃圾收集问题和 java.lang.OutOfMemoryError )的重要工具。它们也是优化内存使用的重要工具。在本文中,我们提供了一些不同的方法来从 Android 应用程序捕获 Heap Dumps。一旦捕获了 Heap Dumps,就可以使用 HeapHero 和 Android Studio’s Heap Analyzer 等强大工具来分析 Heap Dumps。

Memory Profile

下面是在 Android Studio中从 Memory Profile (内存分析器)捕获 Heap Dumps 的步骤:

第一步:运行 app 并选择你要分析的设备。

第二步:在 Android Studio 中点击 View → Tool Windows → Android Profiler。

第三步:在 Android Profiler 中会有一个内存变化的时间轴,这个内存(MEMORY)时间轴位于处理器(CPU)时间轴之下,网络(NETWORK)时间轴之上。双击进入内存时间轴详情,然后就可以点击下载图标进行生成 Heap Dump, 如下图:

生成 Android 的 Heap Dump

阅读更多

Android 底部导航菜单的使用

Android 底部导航停留在屏幕的底部,在应用程序的顶层视图之间提供导航。这是在向后兼容的设计支持库中引入的。当应用程序有三到五个顶级导航时,应该使用底部导航。本文将介绍底部导航的基础知识,并将其与 Fragment相结合。我们还将学习如何通过通过 HTTP 调用获取 JSON 来加载第一个带有网格数据的片段(使用 RecyclerView)。

底部导航

使用 Bottom Navigationview 组件可以轻松添加底部导航。您必须使用约束关系或相对关系属性,使它出现在屏幕底部。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="?android:attr/windowBackground"
        app:itemBackground="@color/bgBottomNavigation"
        android:foreground="?attr/selectableItemBackground"
        app:itemIconTint="@android:color/white"
        app:itemTextColor="@android:color/white"
        app:menu="@menu/navigation" />

</android.support.design.widget.CoordinatorLayout>

阅读更多

Android 构建多语言支持的应用程序

Android 是少数流行的移动操作系统之一,拥有超过 190 个国家的数百万用户,并日益增长。所以当你想让你的应用在全球取得成功时,让应用本地化总是一个好主意。在进行本地化时,您应该考虑根据地区或国家使用适当的文本、音频、货币、数字和图形。但本教程只涉及本地化 Resource 支持多种语言。使用参考资料进行本地化说明在本地化应用程序时应该考虑其他事项。在本文中,我们将构建一个支持多语言的应用程序,它支持法语、德语、印地语和日语。

字符串本地化的工作原理

默认情况下,android 将英语作为主要语言,并从 res ⇒ values ⇒ strings.xml 加载字符串资源。当您想要添加对另一种语言的支持时,您需要通过添加连字符和 ISO 语言代码来创建一个 values 文件夹。例如,如果希望添加对法语的支持,应该创建一个名为 values-fr 的 values 文件夹,并在其中保存一个 strings.xml 文件,其中的所有字符串都翻译成法语。

简而言之,本地化工作如下:

  1. 当用户通过设置语言和输入改变设备语言时,android 操作系统会检查应用程序中是否有合适的语言资源(假设用户选择法语)。
  2. 如果应用支持所选的语言,则 android 在项目的 values-(ISO 语言代码)文件夹中查找其字符串资源。(对于法语,它从 values-fr/string.xml 加载字符串值)。
  3. 如果受支持的语言 strings.xml 缺少任何字符串值,则 android 始终会从默认的 strings.xml 文件(即 values/strings.xml)中加载缺少的字符串。

因此,默认的 stings.xml 文件必须包含应用程序使用的所有字符串值,否则应用程序将崩溃或强制关闭错误。

阅读更多

Android 中的 RecyclerView 使用

Android Recyclerview 是 ListView 的升级版,具有性能提升等优点。同时使用 Recyclerview 和 CardView,可以很容易地创建列表和网格。以下是关于 Recyclerview 和其他例子的完整信息。在本教程中,我们将学习如何使用自定义布局呈现简单的 Recyclerview。我们还将学习编写适配器类、添加列表分隔符和行单击侦听器。我们将要设计的 Recyclerview 视图包含显示标题、类型和发行年份的电影列表。

以下是带有必要属性的RecyclerView小部件:

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:scrollbars="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

在开始之前,请确保将您的 Android Studio 更新到最新版本。目前我的 Android Studio 更新到 Android Studio 3.2。

阅读更多

使用 Butterknife 绑定 Android 中的 View 对象

Android ButterKnife 库是一个视图注入库,它使用注解将视图注入 android activity/fragment。例如,@BindView 批注通过自动类型转换视图元素来替代使用 findViewById() 方法。

不仅仅是视图绑定,butterknife 还提供了许多其他有用的选项,比如绑定字符串、调光、绘图、单击事件等等。我们将简要介绍本文中提供的每个组件。

添加 ButterKnife 依赖

您要做的第一件事是,通过在项目的 app/build.gradle 文件中添加以下依赖项,在项目中添加 ButterKnife。添加完成后,同步你的项目,你就可以开始了。

dependencies {
    ...
 
    // butter knife
    compile 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}

阅读更多

使用开源框架 Dexter 轻松实现 Android 动态权限申请

我们都知道 Android Marshmallow 引入了运行时权限,允许用户在运行时允许或拒绝任何权限。实现运行时权限是一个冗长乏味的过程,开发人员需要编写大量代码才能获得单个权限。

在本文中,我们将简化使用 Dexter 库添加运行时权限的过程。使用这个库,权限可以在几分钟内实现。下载示例 APK

这是一篇关于 Dexter 的介绍性文章,介绍了该框架所提供的基本特性。Dexter 还提供了其他一些功能,比如与 SnackBar 一起使用、不同类型的监听器、错误处理等等。你可以在 Dexter 的 GitHub主页 页面找到更多信息。

阅读更多

如何在 Android 中使用 Font Awesome 字体图标

Font Awesome 是非常受欢迎的图标工具,许多网站都在使用。它有免费和专业的图标集,但你可以在免费的图标集中找到大多数图标。每个图标都将由 unicode (&#xf17b;)表示。我们使用这个 unicode 在 TextView 中显示图标。因为它是一个普通的 TextView,所有的文本样式属性(颜色,大小,划片等)可以应用。

例如:如果你想显示安卓机器人图标,您可以使用 &#xf17b; unicode 作为 TextView 值。

详情可参考此项目:https://github.com/ravi8x/Android-Font-Awesome

阅读更多