willkernel
Lifelong learning
2018-04-19T16:41:06.057Z
http://willkernel.github.io/
willkernel
Hexo
C++(一)
http://willkernel.github.io/2018/04/08/CPP-一/
2018-04-08T00:16:00.000Z
2018-04-19T16:41:06.057Z
<h4 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h4><blockquote>
<p>C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程<br>C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点<br>C++ 是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的。C++ 进一步扩充和完善C,是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序<br>注意:使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查<br>2014 ISO/IEC 14882:2014 C++14 第四个C++标准</p>
</blockquote>
<blockquote>
<p>C++ 完全支持面向对象的程序设计,包括面向对象开发的四大特性:<br>封装<br>抽象<br>继承<br>多态</p>
</blockquote>
<blockquote>
<p>标准库<br>标准的 C++ 由三个重要部分组成:<br>核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。<br>C++ 标准库,提供了大量的函数,用于操作文件、字符串等。<br>标准模板库(STL),提供了大量的方法,用于操作数据结构等</p>
</blockquote>
<ul>
<li><a href="https://sourceforge.net/projects/mingw/files/" target="_blank" rel="noopener">MinGW</a></li>
</ul>
<h4 id="语法"><a href="#语法" class="headerlink" title="语法"></a>语法</h4><ul>
<li><p>程序结构</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">#include <iostream></span><br><span class="line">using namespace std;</span><br><span class="line"> </span><br><span class="line">// main() 是程序开始执行的地方 ,单行注释</span><br><span class="line"> </span><br><span class="line">int main()</span><br><span class="line">{</span><br><span class="line"> cout << "Hello World"; // 输出 Hello World</span><br><span class="line"> return 0;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>包含头文件<code><iostream></code></li>
<li><code>using namespace std;</code>使用std命名空间</li>
<li><code>int main()</code>主函数,程序从这里开始执行</li>
<li><code>return 0</code> 终止main()函数,返回0</li>
</ul>
</li>
<li>编译执行<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ touch hello.cpp</span><br><span class="line">$ g++ hello.cpp</span><br><span class="line">$ ./a.exe</span><br><span class="line">Hello World</span><br></pre></td></tr></table></figure>
</li>
</ul>
SQLite(三)
http://willkernel.github.io/2018/04/08/SQLite-三/
2018-04-07T16:07:00.000Z
2018-04-07T16:08:11.257Z
<h4 id="SQLite-Java"><a href="#SQLite-Java" class="headerlink" title="SQLite Java"></a>SQLite
Source Insight 使用
http://willkernel.github.io/2018/04/07/Source-Insight-使用/
2018-04-07T13:36:00.000Z
2018-04-07T14:45:48.622Z
<ul>
<li>New project<img src="http://p4n1d4izv.bkt.clouddn.com/images/srcinsight-1.png"></li>
<li>Add all<img src="http://p4n1d4izv.bkt.clouddn.com/images/srcinsight-2.png">
<img src="http://p4n1d4izv.bkt.clouddn.com/images/srcinsight-3.png"></li>
<li>close<img src="http://p4n1d4izv.bkt.clouddn.com/images/srcinsight-4.png">
Java 小知识
http://willkernel.github.io/2018/04/02/Java-小知识/
2018-04-02T15:53:00.000Z
2018-04-02T16:31:31.061Z
<ul>
<li><p><code>transient</code> vs
Window和WindowManager
http://willkernel.github.io/2018/04/02/Window和WindowManager/
2018-04-02T15:17:00.000Z
2018-04-02T18:02:20.763Z
<ul>
<li><p>Window和WindowManager<br>Window表示一个窗口,可以实现在桌面上显示悬浮窗,Window是一个抽象类,具体实现是PhoneWindow。通过WindowManager创建Window,WindowManager是外界访问Windo
SQLite(二)
http://willkernel.github.io/2018/04/02/SQLite-二/
2018-04-02T04:08:00.000Z
2018-04-07T16:07:56.843Z
<h4 id="数据库操作"><a href="#数据库操作" class="headerlink" title="数据库操作"></a>数据库操作</h4><ul>
<li><p>创建</p>
<figure class="highlight
SQLite(一)
http://willkernel.github.io/2018/03/30/SQLite-一/
2018-03-30T07:56:00.000Z
2018-04-02T04:06:25.882Z
<h4 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h4><p>SQLite特点:无服务器、零配置、事务性的 SQL 数据库引擎,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接;非常小轻量级,兼容ACID原则,是进程或线程安全的</p>
<blockquote>
<p>ACID是一组强调高可靠性的数据库系统设计原则,在软件崩溃甚至是硬件故障的情况下,数据也不会损坏。当你需要依赖兼容ACID原则的业务时,你不必重复造轮子去实现一致性检查和崩溃恢复机制。如果你有额外的安全保证机制,可以调整牺牲掉ACID的一些可靠性换取更高的性能和数据吞吐量<br>A: atomicity (原子性)<br>C: consistency (一致性)<br>I: isolation (隔离性)<br>D: durability (持久性)</p>
</blockquote>
<blockquote>
<p>SQL92 不支持的特性如下<br>RIGHT OUTER JOIN 只实现了 LEFT OUTER JOIN<br>FULL OUTER JOIN 只实现了 LEFT OUTER JOIN<br>ALTER TABLE 支持 RENAME TABLE 和 ALTER TABLE 的 ADD COLUMN variants 命令,不支持 DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT<br>Trigger 支持 FOR EACH ROW 触发器,但不支持 FOR EACH STATEMENT 触发器<br>VIEWs 在 SQLite 中,视图是只读的,不可以在视图上执行 DELETE、INSERT 或 UPDATE 语句<br>GRANT 和 REVOKE 可以应用的唯一的访问权限是底层操作系统的正常文件访问权限</p>
</blockquote>
Kotlin for Android(七)
http://willkernel.github.io/2018/03/25/Kotlin-for-Android-七/
2018-03-25T04:08:00.000Z
2018-03-25T13:46:28.638Z
<h4 id="创建业务逻辑访问数据"><a href="#创建业务逻辑访问数据" class="headerlink" title="创建业务逻辑访问数据"></a>创建业务逻辑访问数据</h4><blockquote>
<p>从数据库获取数据<br>检查是否存在对应星期的数据<br>如果有,返回UI并且渲染<br>如果没有,请求服务器获取数据<br>结果被保存在数据库中并且返回UI渲染</p>
</blockquote>
<ul>
<li><p>数据源应该是一个具体的实现,这样就可以被容易地修改,所以增加一些额外的代码,然后把 command 从数据访问中抽象出来听</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">interface ForecastDataSource {</span><br><span class="line">fun requestForecastByZipCode(zipCode: Long, date: Long): For</span><br><span class="line">ecastList?</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
<li><p>使用数据库的数据源和服务端数据源。顺序是很重要的,因为它会根据顺序去遍历这个sources,然后一旦获取到有效的返回值就会停止查询。逻辑顺序是先在本地查询(本地数据库中),然后再通过API查询</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">class ForecastProvider(private val source: List<ForecastDataSource> = ForecastProvider.SOURCES) {</span><br><span class="line"> companion object {</span><br><span class="line"> val DAY_IN_MILLIS = 1000 * 60 * 60 * 24</span><br><span class="line"> val SOURCES = listOf(ForecastDb(), ForecastServer())</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> fun requestByZipCode(zipCode: Long, days: Int): ForecastList = source.firstResult {</span><br><span class="line"> requestSource(it, days, zipCode)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> private fun requestSource(source: ForecastDataSource, days: Int, zipCode: Long): ForecastList? {</span><br><span class="line"> val res = source.requestForecastByZipCode(zipCode, todayTimeSpan())</span><br><span class="line"> return if (res != null && res.size >= days) res else null</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> private fun todayTimeSpan() = System.currentTimeMillis() / DAY_IN_MILLIS * DAY_IN_MILLIS</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
</ul>
Kotlin for Android(六)
http://willkernel.github.io/2018/03/24/Kotlin-for-Android-六/
2018-03-24T05:45:00.000Z
2018-03-25T03:48:57.586Z
<h4 id="Kotlin中的null安全"><a href="#Kotlin中的null安全" class="headerlink"
Kotlin for Android (五)
http://willkernel.github.io/2018/03/24/Kotlin-for-Android-五/
2018-03-23T17:18:00.000Z
2018-04-03T01:56:24.193Z
<h4 id="创建SQLiteHelper"><a href="#创建SQLiteHelper" class="headerlink" title="创建SQLiteHelper"></a>创建SQLiteHelper</h4><p>一般使用SqliteOpenHelper
Kotlin for Android (四)
http://willkernel.github.io/2018/03/23/kotlin-for-Android-四/
2018-03-23T12:08:00.000Z
2018-03-23T17:18:10.630Z
<h4 id="Application单例化和属性的Delegated"><a href="#Application单例化和属性的Delegated" class="headerlink"
Kotlin for Android (三)
http://willkernel.github.io/2018/03/23/Kotlin-for-Android-三/
2018-03-23T08:34:27.000Z
2018-03-23T12:06:54.135Z
<h4 id="操作符"><a href="#操作符" class="headerlink" title="操作符"></a>操作符</h4><img
Kotlin for Android (二)
http://willkernel.github.io/2018/03/23/Kotlin-for-Android-二/
2018-03-23T02:47:00.000Z
2018-03-23T08:33:33.257Z
<h4 id="Anko"><a href="#Anko" class="headerlink" title="Anko"></a><a href="https://github.com/Kotlin/anko" target="_blank" rel="noopener">Anko</a></h4><ul>
<li>Anko Commons:一个轻量级的库,里面包含了intents,对话框,日志等帮助类</li>
<li>Anko Layouts:用于编写动态Android布局的快速且类型安全的方法</li>
<li>Anko SQLite:查询适用于Android SQLite的DSL和分析器集合</li>
<li>Anko Coroutines:基于kotlinx.coroutines库的实用程序</li>
<li>简化获取RecyclerView<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">val forecastList: RecyclerView = find(R.id.recyclerView)</span><br></pre></td></tr></table></figure>
</li>
</ul>
<h4 id="扩展函数"><a href="#扩展函数" class="headerlink" title="扩展函数"></a>扩展函数</h4><p>扩展函数数是指在一个类上增加一种新的行为,甚至我们没有这个类代码的访问权<br>限。这是一个在缺少有用函数的类上扩展的方法。在Java中,通常会实现很多带有<br>static方法的工具类。Kotlin中扩展函数的一个优势是我们不需要在调用方法的时候<br>把整个对象当作参数传入。扩展函数表现得就像是属于这个类的一样,而且我们可<br>以使用 this 关键字和调用所有public方法<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">fun Context.toastF(message: CharSequence,duration: Int=Toast.LENGTH_SHORT){</span><br><span class="line"> Toast.makeText(this, "$message", duration).show()</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<ul>
<li><p>Anko已经扩展toast函数,提供了CharSequence,(resource id)Int的函数</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">toast(R.string.app_name)</span><br><span class="line">longToast("longToast")</span><br></pre></td></tr></table></figure>
</li>
<li><p>扩展函数并不是真正地修改了原来的类,它是以静态导入的方式来实现的。扩展函数可以被声明在任何文件中,通用的实践是把一系列有关的函数放在一个新建的文件里</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">var TextView.text: CharSequence</span><br><span class="line"> get() = getText()</span><br><span class="line"> set(v) = setText(v)</span><br></pre></td></tr></table></figure>
</li>
</ul>
Kotlin for Android (一)
http://willkernel.github.io/2018/03/22/Kotlin-for-Android-一/
2018-03-22T15:43:00.000Z
2018-03-23T02:49:12.143Z
<h4 id="介绍Kotlin"><a href="#介绍Kotlin" class="headerlink" title="介绍Kotlin"></a>介绍Kotlin</h4><ul>
<li>编写代码量少</li>
<li>更加安全:Kotlin编译时期就处理了各种null的情况,避免了执行时异常。如果一个对象可以是null,则我们需要明确地指定它,然后在使用它之前检查它是否是null</li>
<li>它是函数式的:Kotlin是基于面向对象的语言,它使用了很多函数式编程的概念,比如,使用lambda表达式来更方便地解决问题。其中一个很棒的特性就是Collections的处理方式</li>
<li>它可以扩展函数:可以扩展类的更多的特性,甚至我们没有权限去访问这个类中的代码</li>
<li>它是高度互操作性的:你可以继续使用所有的你用Java写的代码和库,因为两个语言之间的互操作性是完美的。可以在一个项目中使用Kotlin和Java两种语言混合编程</li>
</ul>
<h4 id="特性"><a href="#特性" class="headerlink" title="特性"></a>特性</h4><h5 id="Expresiveness-可读性"><a href="#Expresiveness-可读性" class="headerlink" title="Expresiveness 可读性"></a>Expresiveness 可读性</h5><ul>
<li><p>POJO</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">public class Artist {</span><br><span class="line">private long id;</span><br><span class="line">private String name;</span><br><span class="line">private String url;</span><br><span class="line">private String mbid;</span><br><span class="line">public long getId() {</span><br><span class="line">return id;</span><br><span class="line">}</span><br><span class="line">public void setId(long id) {</span><br><span class="line">this.id = id;</span><br><span class="line">}</span><br><span class="line">···</span><br></pre></td></tr></table></figure>
</li>
<li><p>Kotlin中创建数据类Artist.kt,自动生成所有属性和访问器</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">data class Artist(var id: Long, var name: String, var url: String, var mbid: String)</span><br></pre></td></tr></table></figure>
</li>
</ul>
<h5 id="空安全"><a href="#空安全" class="headerlink" title="空安全"></a>空安全</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"> //编译不通过,非空类不能为null</span><br><span class="line"> var artist:Artist=null</span><br><span class="line"> </span><br><span class="line"> //安全调用操作符? 明确地指定一个对象是否能为空</span><br><span class="line"> var artist: Artist? = null</span><br><span class="line"> </span><br><span class="line">// 无法编译, artist可能是null,需要进行处理</span><br><span class="line">// artist.hashCode()</span><br><span class="line"></span><br><span class="line">//在artist!=null时调用</span><br><span class="line">artist?.hashCode()</span><br><span class="line"></span><br><span class="line">// 判空</span><br><span class="line">if(artist!=null){</span><br><span class="line"> artist.hashCode()</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">//给定在null时的替代者</span><br><span class="line">val name=artist?.name?:"empty"</span><br><span class="line"></span><br><span class="line">//确保artist不是null的情况下调用,否在抛异常KotlinNullPointerException</span><br><span class="line">artist!!.hashCode()</span><br></pre></td></tr></table></figure>
RxJava2
http://willkernel.github.io/2018/03/20/RxJava2/
2018-03-20T07:14:00.000Z
2018-03-21T18:07:17.577Z
<h5 id="RxJava2"><a href="#RxJava2" class="headerlink" title="RxJava2"></a>RxJava2</h5><p>RxJava是Java VM响应式编程扩展的实现,扩展了观察者模式,通过操作符对数据事件流操作,来编写异步和基于事件的程序,从而不用关心同步,线程安全并发等问题</p>
<ul>
<li>app/build.gradle<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">implementation 'io.reactivex.rxjava2:rxjava:2.1.9'</span><br><span class="line">implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'</span><br><span class="line"></span><br><span class="line">//retrofit</span><br><span class="line">implementation 'com.squareup.retrofit2:retrofit:2.3.0'</span><br><span class="line">//Gson converter</span><br><span class="line">implementation 'com.squareup.retrofit2:converter-gson:2.3.0'</span><br><span class="line">//RxJava2 Adapter</span><br><span class="line">implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'</span><br><span class="line">//okhttp</span><br><span class="line">implementation 'com.squareup.okhttp3:okhttp:3.8.1'</span><br><span class="line">implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'</span><br></pre></td></tr></table></figure>
</li>
</ul>
Data Binding
http://willkernel.github.io/2018/03/16/Data-Binding/
2018-03-16T05:38:00.000Z
2018-03-21T18:10:19.922Z
<h5 id="Data-Binding-Library"><a href="#Data-Binding-Library" class="headerlink" title="Data Binding Library"></a>Data Binding Library</h5><p>数据绑定库编写声明式布局,尽量减少绑定应用程序逻辑和布局所需的代码,减少布局绑定相关代码</p>
<ul>
<li><p>build environment</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">android{</span><br><span class="line">...</span><br><span class="line"> dataBinding {</span><br><span class="line"> enabled = true</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
<li><p>Data Binding Compiler V2</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">android.databinding.enableV2=true</span><br><span class="line">向后不兼容</span><br></pre></td></tr></table></figure>
</li>
</ul>
Dagger
http://willkernel.github.io/2018/03/13/Dagger/
2018-03-12T16:12:00.000Z
2018-03-21T18:11:03.531Z
<h5 id="Dagger"><a href="#Dagger" class="headerlink" title="Dagger"></a>Dagger</h5><p>依赖注入(Dependency Injection),简称DI,又叫控制反转(Inversion of Control),简称IOC<br>当一个类的实例需要另一个类的实例,在传统的设计中,通常由调用者来创建被调用者的实例,然而依赖注入的方式,创建被调用者不再由调用者创建实例,创建被调用者的实例的工作由IOC容器来完成,然后注入到调用者。因此也被称为依赖注入</p>
<ul>
<li>API<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">public @interface Component {</span><br><span class="line"> Class<?>[] modules() default {};</span><br><span class="line"> Class<?>[] dependencies() default {};</span><br><span class="line"> @Target(TYPE)</span><br><span class="line"> @Documented</span><br><span class="line"> @interface Builder {}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">public @interface Subcomponent {</span><br><span class="line"> Class<?>[] modules() default {};</span><br><span class="line"> @Target(TYPE)</span><br><span class="line"> @Documented</span><br><span class="line"> @interface Builder {}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">public @interface Module {</span><br><span class="line"> Class<?>[] includes() default {};</span><br><span class="line"> @Beta</span><br><span class="line"> Class<?>[] subcomponents() default {};</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">public @interface Provides {</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">public @interface MapKey {</span><br><span class="line"> boolean unwrapValue() default true;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">public interface Lazy<T> {</span><br><span class="line"> T get();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
</ul>
ConstraintLayout
http://willkernel.github.io/2018/03/10/ConstraintLayout/
2018-03-09T18:16:00.000Z
2018-03-20T07:12:15.997Z
<ul>
<li><p>引入constraint-layout</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">allprojects {</span><br><span class="line"> repositories {</span><br><span class="line"> jcenter()</span><br><span class="line"> maven {</span><br><span class="line"> url 'https://maven.google.com'</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">compile 'com.android.support.constraint:constraint-layout:1.1.0-beta5'</span><br></pre></td></tr></table></figure>
</li>
<li><p>属性</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">layout_constraintLeft_toLeftOf</span><br><span class="line">左对齐</span><br><span class="line">layout_constraintLeft_toRightOf</span><br><span class="line">左边和约束控件的右边对齐</span><br><span class="line">layout_constraintRight_toLeftOf</span><br><span class="line">右边在某组件的左边</span><br><span class="line">layout_constraintRight_toRightOf</span><br><span class="line">右边在某组件的右边</span><br><span class="line">layout_constraintTop_toTopOf</span><br><span class="line">上边和某组件的上边对其</span><br><span class="line">layout_constraintTop_toBottomOf</span><br><span class="line">上边在某组件的下边</span><br><span class="line">layout_constraintBottom_toTopOf</span><br><span class="line">下边在某组件的上边</span><br><span class="line">layout_constraintBottom_toBottomOf</span><br><span class="line">下边在某组件的下边</span><br><span class="line">layout_constraintBaseline_toBaselineOf</span><br><span class="line">组件的基线位置和某组件的基线位置对其(很少用)</span><br><span class="line">layout_constraintStart_toEndOf</span><br><span class="line">layout_constraintStart_toStartOf</span><br><span class="line">layout_constraintEnd_toStartOf</span><br><span class="line">layout_constraintEnd_toEndOf</span><br><span class="line">属性的值有两种,一种是同层级组件ID,还有就是parent,当值为parent时即是相对于父布局进行定位</span><br></pre></td></tr></table></figure>
</li>
</ul>
CoordinatorLayout
http://willkernel.github.io/2018/03/09/CoordinatorLayout/
2018-03-09T02:33:00.000Z
2018-03-21T18:13:30.692Z
<h4 id="CoordinatorLayout"><a href="#CoordinatorLayout" class="headerlink" title="CoordinatorLayout"></a>CoordinatorLayout</h4><p>Material风格布局,包含在support Library中,结合AppbarLayout,CollapsingToolbarLayout等可达到MD设计风格布局</p>
<ul>
<li>build.gradle<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">def SUPPORT = "26.1.0"</span><br><span class="line">dependencies {</span><br><span class="line"> implementation 'com.android.support:appcompat-v7:26.1.0'</span><br><span class="line"> implementation 'com.android.support.constraint:constraint-layout:1.0.2'</span><br><span class="line"> implementation "com.android.support:design:$SUPPORT"</span><br><span class="line"> implementation "com.android.support:cardview-v7:$SUPPORT"</span><br><span class="line"> implementation "com.android.support:recyclerview-v7:$SUPPORT"</span><br><span class="line"> implementation 'de.hdodenhof:circleimageview:1.3.0'</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
</ul>
Git
http://willkernel.github.io/2018/03/09/Git/
2018-03-08T17:04:00.000Z
2018-03-22T09:08:53.194Z
<h4 id="入门"><a href="#入门" class="headerlink" title="入门"></a>入门</h4><ul>
<li>.git 的隐藏目录是你的本地仓库(Local Repository)</li>
<li><code>git log</code> 查看历史 <img src="http://p4n1d4izv.bkt.clouddn.com/images/gitlog.png"></li>
<li><code>git log -p</code>查看详细历史</li>
<li><code>git log --stat</code> 查看简要统计</li>
<li><code>git show e66666/branch</code>查看指定commit,加文件名看指定文件</li>
<li><code>git diff --staged/--cached</code>查看当前工作目录与暂存区的不同,可以看到即将添加到暂存区的改动内容,<code>git diff HEAD</code>看到当前工作目录与上一个commit的不同<ul>
<li>commit 的 SHA-1 校验和<br><code>commit 8cf88cf35ce40cb91488e7d9b12cf46463fedc2f</code></li>
</ul>
</li>
<li><code>git status</code><img src="http://p4n1d4izv.bkt.clouddn.com/images/gitstatus.png">