项目练习
- 通用的Android练习模版设置,此文章介绍了怎么提高练习项目的效率,我从中学到了学习建立公共库,让工程中的其它module都使用共同库的依赖,避免重复导入第三方依赖
- 为Activity设置统一标题栏,在项目使用过程中发现这样使用设置状态栏全透明不起作用。
- Android studio 自定义顶部工具栏toolBar
- Android中为layout创建子文件夹,官方
- java折叠代码块
- gradle 各种版本下载
- Android Studio中使用Git进行代码管理(分支、合并)
- Android Studio 删除多余的import、
- Android Tools 属性解决列表测试预览问题
- Android API Level对应Android版本一览表
- Android Studio如何给默认创建的activity添加注释头
- Android获取应用签名(开发版SHA1和发布版SHA1) keytool命令需要到jdk安装目录的bin下打开cmd执行
纠错
- 关于TaskExecutionException:Execution failed for task
':app:compileDebugJavaWithJavac’和
‘:app:transformJackWithJackForDebug’–对于tools:replace="android:icon"一样。如果同时存在则以,隔开
tools:replace=“android:theme,android:icon” - 当Retrofit2+RxJava2遇到为null的返回结果
- Android Studio 引用第三方包时,com.android.support 因版本冲突问题
- Manifest merger failed : Attribute application@appComponentFactory value
- 由于 Android P 限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉
- Androidx和Android support库共存问题解决
- App is not indexable by Google Search
- 包名不要用大写,要全小写
Gradle
事件
系统UI
-
-
设置控件不可点击
view.setClickable(false)
,在注册了点击事件后,此方法就不起作用了,可以根据状态动态注册点击事件 -
控件高度
wrap_content
时,可设置minHeight
控制最小高度 -
代码设置drawableLeft
setBounds
方法一定要写在setCompoundDrawables
之前 -
android:clipToPadding–是否允许viewGroup在padding中绘制子view。默认情况下,此属性设置为true,即不允许。
android:clipChildren–是否允许子view超出父view。默认是true,不允许。 -
EditText
- 详解EditText输入监听TextWatcher 又一篇TextWatcher
- Android之自定义EditText光标和下划线颜色
- 监听EditText获取焦点用
setOnFocusChangeListener
- EditText禁止弹出软键盘(禁止编辑)
setInputType(InputType.TYPE_NULL)
- EditText代码中设置InputType为密码
setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|InputType.TYPE_CLASS_TEXT)
- 设置minLines同时height必须为
wrap_content
不能指定高度。否则minLines会失效 - EditText横向滚动需同时设置三个属性
android:inputType="text"
android:maxLines="1"
android:scrollHorizontally="true"
亲测可用 - 限制输入长度(不区分中英文)
edit_title.setFilters(new InputFilter[]{ new InputFilter.LengthFilter(getResources().getInteger(R.integer.title_max))});
-
LinearLayout
-
RelativeLayout
-
TextView
- android Textview 超出自动截断,显示"…"
- 消除TextView自带边界
- TextView 中设置一行显示字数
- Android —— TextView 之 本地化数据交换格式 和 android 字符串格式化
- Android上的自定义字体 - 扩展TextView
- android 关于TextView getLineCount() 获得的值始终为0问题
- Html.fromHtml(String)过时的替代方法
- Android在代码中设置控件的drawableLeft,drawableRight,drawableTop,drawableBottom。
- SpannableStringBuilder的setSpan方法使用需注意点!
- Android-Linkify的使用
- textView 占位符,布局文件显示不出效果,只有运行起来才能看到效果
- textView行间距
lineSpacingExtra
- LinearLayout分隔符妙用
-
RecyclerView
-
NestScrollView
-
NestScollView滚动到最底部
new Handler().post(new Runnable() { @Override public void run() { nestScrollView.fullScroll(NestedScrollView.FOCUS_DOWN);//滚动到底部 } });
-
ViewPager
图形绘制
存储
网络相关
- Okhttp3拦截器-应用拦截器和网络拦截器的区别
- Okhttp日志拦截器,日志级别和只在开发环境输出日志
- HTTP Request Header 请求头理解
- Retrofit 2.0 使用
- Retrofit探索之路
- JAVA-使用gson校验字符串是否是json
Fragment
- Android Fragment 真正的完全解析(上)
- 在这篇文章我学习到了,remove方法默认会销毁Fragment的实例,如果把Fragment加入到了回退栈
addToBackStack()
,remove方法则不会销毁Fragment实例,但是会依然会销毁视图层
- 在这篇文章我学习到了,remove方法默认会销毁Fragment的实例,如果把Fragment加入到了回退栈
- Android Fragment 真正的完全解析(下)
- 在这篇文章我学习到了考虑到Fragment的复用,所有Fragment的通信都应该通过他们的管理者Activity来决定,不能是多个Fragment之间直接通信(尽管这样也可以达到目的),所以就用到了 接口回调
- 当屏幕发生旋转或者应用长时间在后台被回收时Activity会重新启动(通过onCreate的参数Bundle savedInstanceState就可以判断Activity是否已经重建),Activity中的Fragment会被保存下来(用户输入的数据不会保存下来),但是会创建新的FragmentManager,新的FragmentManager会首先去获取保存下来的Fragment队列,重建Fragment队列,从而恢复之前的状态。所以在onCreat方法中,先判断savedInstanceState是否为null,为null则创建新的Fragment实例,不为null,则复用fragment队列中的Fragment
- Android Fragment 你应该知道的一切
- 学习到了通过使用arguments来创建Fragment来实现activity向Fragment中传递数据,在Fragment的onCreate方法中获取数据(其实就是newInstance)
- 不再一个Activity的Fragment传递数据,利用startActivityForResult
- 在同一个Activity中的Fragmernt之间传递数据,一种是利用接口回调通过管理者Activity传递,一种就是本文的利用setTargetFragment传递
- Activity重建时保持Fragment状态的方法
- 在这篇文章学习到了fragment重建时保存数据的一种方法
- 解决fragment重叠问题
- 我加深了对Activity和fragment周期的了解
MVP
- 浅谈 MVP in Android,通过这篇文章我练习了第一个MVP的demo,我的demo–github地址
RxJava2
- 入门
- 我学习到了如何创建基本的被观察者、观察者,以及他们之间的订阅关系
- 被观察发送的3中事件onNext,onComplete,onError和ObservableEmitter(发射器)和Disposable(可以用来解除订阅关系)
- 发送事件的规则,onComplete和onError的互斥
- 观察者的完整回调,subscribe()只有一个Observer,即下游可以相应发送的任何事件。。观察者的不完整回调(subscribe()的多个重载方法),其中带有一个参数Consumer的方法,表示下游只关心onNext事件
- RxJava强大的线程控制(subscribeOn和observeOn)
- 我学习到了正常情况下上游和下游工作在同一个线程中的,也就是收上游在哪个线程发送事件,下游就在哪个线程接受事件,所以在Activity中,我们在主线程创建一个Observable来发送事件,那么上游就 默认 在主线程发送事件;当然我们在主线程创建一个Observer来接收事件,那么下游就 默认 就在主线程接受事件
- subscribeOn() 指定的是上游发送事件的线程, observeOn() 指定的是下游接收事件的线程,多次调用subscribeOn(),只有第一次有效,其余的都会忽略;多次调用observeOn() ,则每调用一次,下游的线程就会切换一次
- 在RxJava中内置的几个主要线程,其中熟悉的Schedulers.io 和AndroidSchedulers.mainThread(引入RxAndroid才会有这个)
- 当activity退出时,调用Disposable的ispose()方法切断订阅关系,以及有多个Disposable时,使用CompositeDisposable容器切断订阅关系
- map,flatMap,concatMap(变换操作符)
- map:它可以把上游发送的事件转换成任意类型后再发送给下游
- flatMap可以把上游发送的一个类型的事件变换为几种不同类型的事件(不同的上游),然后再把这些不同的类型事件合并后放在一个单独的上游,注意flatMap不能保证事件发送的顺序(例子:注册成功之后自动登录)
- concatMap作用同flatMap,只不过是它能保证事件发送的顺序,此外我还学习到了 默认 情况下的事件流的执行顺序,先发送上游的一个事件,然后执行doOnNext,再执行下游的onNext,若上游事件发送失败,则不会执行不会执行doOnNext和onNext
- ZIP( 组合/合并操作符),它将多个上游的不同事件严格按照顺序组合成到一起发送给下游。
- ZIP的缺点
- 我学到了订阅关系的同步和异步,当上下游在 同一个线程 工作时就是 同步 的订阅关系,也就是说上游每发送一个事件 必须 要等到 下游 接受处理完了以后才能接着发送下一个事件;当上下游工作在 不同的线程 中时,就是 一个 异步 的订阅关系,这个时候 上游 发送数据 不需要 等到 下游 接受,因为两个线程并不能直接进行通信。
- 关于ZIP缺点的解决办法
- 我学到了过滤操作符filter()的使用,它能指定上游符合过滤条件的时事件发送到下游
- 过滤操作符sample,它是每隔一段时间发送上游的数据
7. Flowable作为上游 - 我学习到了Subscription,它决定下游处理事件的能力,也可利用cancle方法切断订阅关系
8. Flowable的策略
其它
- Java方法注释中,添加尖括号的方法
- 不一样的 Java 日期格式化大全
- Java利用正则去除所有HTML标签
replaceAll("<[^>]+>",""))
- postman中post请求下form-data、x-www-form-urlencoded、raw、binary的区别
- Java工具包中的Formatter类
- Matisse选择多余的图片报错,闪退
- java字符串0.5转成500
((Double)(Double.valueOf("0.5" * 10000)).intValue()