|
1 |
| -## 小贴士 |
| 1 | +# 小贴士 |
| 2 | + |
| 3 | +## 引用传递 |
| 4 | + |
| 5 | +Java中方法的形参,8大基本类型(byte,char,short,int,long,float,double,boolean)和string为**值传递**,其余类型为内存地址的**引用传递**,注意在Android中的Adapter无法更新集合,以及浅拷贝和深拷贝的问题 |
| 6 | + |
| 7 | +## RecyclerView动画 |
| 8 | + |
| 9 | +条目动画错乱的解决方案,要支持静态动画和动态动画,并且监听动画的开始于结束,通过Map对动画条目进行记录,在onBindHolder中判断静态开启或者不开启 |
| 10 | + |
| 11 | +## RecyclerView白光一闪的动画 |
| 12 | + |
| 13 | +`public Object getChangePayload()` 这个方法返回不为null的话,on Change采用Partial bind,就不会出现。 反之就有,因此 `notifyItemChanged` 额外传入一个 `new Object()` 即可取消动画 |
| 14 | + |
| 15 | +## IM软键盘跳闪问题 |
| 16 | + |
| 17 | +由于Android没有原生的软键盘状态的监听器,以及软键盘的显示与聊天面板的Visibilty不同步问题,通过监听根布局的 `onMeasure` 方法,监听高度的变化,通过观察者模式暴露给外部来监听软键盘的状态 |
| 18 | + |
| 19 | +## 字体sp |
| 20 | + |
| 21 | +布局宽高固定写死的地方应该统一用dp显示字体,因为一旦用户在设置中调大字体,sp的话宽高写死的话,布局显示就乱了,也可以设置成不随系统设置改变而改变,在BaseActivity中重写以下方法: |
| 22 | + |
| 23 | +``` |
| 24 | + @Override |
| 25 | + public Resources getResources() { |
| 26 | + Resources res = super.getResources(); |
| 27 | + Configuration configuration = res.getConfiguration(); |
| 28 | + if (configuration.fontScale != 1.0f) { |
| 29 | + configuration.fontScale = 1.0f; |
| 30 | + res.updateConfiguration(configuration, res.getDisplayMetrics()); |
| 31 | + } |
| 32 | + return res; |
| 33 | + } |
| 34 | +``` |
| 35 | + |
| 36 | +## [Androidswipelayout](https://github.com/daimajia/AndroidSwipeLayout) |
| 37 | + |
| 38 | +在部分机型上会难以拖拽,并且自动收回 |
| 39 | + |
| 40 | + |
| 41 | +[Issue](https://github.com/daimajia/AndroidSwipeLayout/issues/412) |
| 42 | + |
| 43 | +最后采用自定义viewgroup,通过ViewDragHelper来实现简易的拖拽,需注意在ViewPager场景下的滑动冲突 |
| 44 | + |
| 45 | +## clipChildren |
| 46 | + |
| 47 | +在某些Android版本下,会出现一闪一闪的Bug,需要禁用硬件加速`android:layerType="none"` |
| 48 | + |
| 49 | +## Double计算 |
| 50 | + |
| 51 | +浮点类计算时会有不精确的误差,用`BigDecimal`来做加`add`,减`subtract`,乘`multiply`,除`divide`的精确计算 |
| 52 | + |
| 53 | +## 详情页面 |
| 54 | + |
| 55 | +进入详情页面尽可能只传入ID,在详情页面中尽可能不要携带非ID数据,防止项目切换H5时高额的维护成本 |
| 56 | + |
| 57 | +## WebView 清理历史记录失效 |
| 58 | + |
| 59 | +重写**WebViewClient**的**doUpdateVisitedHistory**方法,在里面调用WebView的**clearHistory**方法清理一次历史记录 |
| 60 | + |
| 61 | +## 性能优化之启动耗时 |
| 62 | + |
| 63 | +Debug版本测试冷启动的时间会不准确,测量Release版本 |
| 64 | + |
| 65 | +## 弱引用 |
| 66 | + |
| 67 | +实例化匿名内部类会导致弱引用的指向不绑定类的生命周期,gc时就回收,推荐通过类实现接口的方式 |
| 68 | + |
| 69 | +## EditText |
| 70 | + |
| 71 | +Java代码设置InputType时,设置密码需要拼接此类属性,不然无效`setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD | InputType.TYPE_CLASS_TEXT)` |
| 72 | +并且需要重新定义字体`setTypeface(Typeface.DEFAULT)`,不然密码字体会发生变化 |
| 73 | + |
| 74 | +## Drawable |
| 75 | + |
| 76 | +Android5.0以下获取SVG的Drawable,通过`ContextCompat#getDrawable`方法,传入的Context需要来自Activity,或者通过`AppCompatResources#getDrawable`来获取 |
| 77 | + |
| 78 | +## RxJava |
| 79 | + |
| 80 | +自定义Observable create时,发射数据前,对`ObservableEmitter`校验是否Disposed,避免onComplete之后发送onError事件 |
| 81 | + |
| 82 | +联想搜索时,网络抛出异常错误时会接触订阅关系onDispose,故在转换的事件流中调用onErrorResumeNext发送一个事件 |
| 83 | + |
| 84 | +## 适配全面屏 |
| 85 | + |
| 86 | +``` |
| 87 | + <meta-data |
| 88 | + android:name="android.notch_support" |
| 89 | + android:value="true " /> |
| 90 | + <meta-data |
| 91 | + android:name="android.max_aspect" |
| 92 | + android:value="1075419520.000000" /> |
| 93 | + <meta-data |
| 94 | + android:name="android.vendor.full_screen" |
| 95 | + android:value="true" /> |
| 96 | +``` |
| 97 | + |
| 98 | + |
| 99 | +## 过滤WebView的广告 |
2 | 100 |
|
3 | 101 | ```
|
4 | 102 | findViewById(Window.ID_ANDROID_CONTENT).findViewsWithText(outputList,"",View.FIND_VIEWS_WITH_TEXT)
|
5 | 103 | ```
|
6 | 104 | 可以遍历到TextView中的文本,可用于清理腾讯X5内核中WebView弹出的广告
|
7 | 105 |
|
8 |
| ---- |
9 | 106 |
|
10 |
| -自定义属性时的多类型取值 |
| 107 | +## 自定义属性时的多类型取值 |
11 | 108 | ```
|
12 | 109 | TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.);
|
13 | 110 | TypedValue value = new TypedValue();
|
@@ -46,4 +143,22 @@ if (has) {
|
46 | 143 | //未传入
|
47 | 144 | }
|
48 | 145 | array.recycle();
|
49 |
| -``` |
| 146 | +``` |
| 147 | + |
| 148 | +### 单Actviity多Fragment架构 |
| 149 | + |
| 150 | +优点: |
| 151 | +- 页面切换更加轻量级 |
| 152 | +- 中低端机占用更少的资源 |
| 153 | +- 可以在一定程度上实现UI加载慢的问题,譬如Splash在加载的时候,Main就开始渲染 |
| 154 | +- 实现多页面悬浮窗不需要权限 |
| 155 | +- 页面最小化实现起来更简单 |
| 156 | +- 热更新没有太大限制(不需要在AndroidManifest注册) |
| 157 | + |
| 158 | +缺点: |
| 159 | +- 相互切换、事件传递较为复杂,尤其在多层Fragment嵌套的场景下 |
| 160 | + |
| 161 | + |
| 162 | + |
| 163 | + |
| 164 | + |
0 commit comments