弹出PopupWindow后让背景变暗的方法
在Android上使用AlertDialog和PopupWindow都可以很方便的实现弹窗,AlertDialog弹出后背景会变暗,而PopupWindow不具有此特性。StackOVerflow上的这个问题里给出了三种方法以实现弹出PopupWindow后让背景变暗的效果,整理如下。 1. 方法一 使用WindowManager.LayoutParams.FLAG_DIM_BEHIND可…
Read more
learn, build, evaluate
在Android上使用AlertDialog和PopupWindow都可以很方便的实现弹窗,AlertDialog弹出后背景会变暗,而PopupWindow不具有此特性。StackOVerflow上的这个问题里给出了三种方法以实现弹出PopupWindow后让背景变暗的效果,整理如下。 1. 方法一 使用WindowManager.LayoutParams.FLAG_DIM_BEHIND可…
Read more
在使用 ButterKnife 8.4.0 和 Support Library 24.2.1 的时候,使用 ButterKnife 绑定 NavigationView 的 Header 里面的 View 时抛出 IllegalStateException 异常,指示“Required view ‘header_text’ with ID 2131492989 for f…
Read more
最近在使用Parcelable时遇到了Class not found when unmarshalling的问题,场景为在指定了单独process的Service中使用AlarmManager添加闹钟: Intent intent = new Intent(context, AlertBroadcastReceiver.class); AlarmModel nextAlarm = getNex…
Read more
位于列表上的FloatingActionButton有时会挡住列表的内容,可以通过为FloatingActionButton添加自定义layout_behavior的方式,在向下滚动列表时隐藏FloatingActionButton,向上滚动列表时显示FloatingActionButton,如图1所示。 0. 布局 这里使用的布局如下,在CoordinatorLayout中放置了Recy…
Read more
Battery Historian可以用来查看Android设备电池相关的信息和事件,适用于Android 5.0和之后的版本。这个工具之前只是一个Python脚本,后来进行了大幅更新。 1. 下载和安装Battery Historian Battery Historian需要安装Go、Git、Python 2.7和Java。 Go的安装步骤可以参考Battery Historian的RE…
Read more
从Memory Monitor和Heap Viewer并不能看出占用内存的对象和分配内存在代码中发生的位置,为了进一步定位内存分配,需要使用Allocation Tracker。Allocation Tracker可以记录应用的内存分配,并列出所有分配的对象和调用栈。 下面例子使用的代码可以在这里找到,运行后点击“MEMORY CHURN”,如图1所示。 点击“DO INTERESTING…
Read more
Memory Monitor可以监视应用的内存使用,并以可视化的方式显示出来。Heap Viewer可以实时地报告应用在内存中分配的对象的类型、数量和在堆上占用的空间。二者都是分析应用内存分配和管理的工具,能够帮助定位内存泄漏等问题。 下面例子使用的代码可以在这里找到,运行后点击“MEMORY LEAKS”,如图1所示。 1. Memory Monitor 在Android Studio中…
Read more
Traceview可以记录方法运行的数据,如运行时间、调用次数等,帮助定位代码中的性能问题。 下面使用的代码可以在这里找到,运行后点击“BATCHING AND CACHING”,如图1所示,点击“COMPUTE SOME FIBONACCI NUMBERS”会开始计算一段斐波那契数列。 在Android Studio中打开Android Device Monitor,在右上角选择DD…
Read more
如果View进行了过多的嵌套,具有较深的层级关系,也会影响性能。下面例子使用Hierarchy Viewer比较了不同层级对性能的影响,Hierarchy Viewer能够可视化地显示布局中View的层级关系,用来对UI进行Debug和优化。代码可以在这里找到,运行后点击“COMPARE LAYOUTS”按钮,界面如图1所示。 其中包含了两个看似完全一样的布局,具体定义在activity_co…
Read more
Android Framework会通过裁剪(Clipping)的方式避免重绘不可见的元素,以此来优化性能。但这一优化对于一些复杂的自定义View无效,如果自定义View重写了onDraw(),系统无法知道View中各个元素的位置和层级关系,也就无法自动省略绘制不可见的元素。Canvas提供了一些特殊的方法,可以用来向Android Framework告知Canvas的哪些部分不可见、不需要绘…
Read more