Kotlin + Databinding的使用及注意点

一、在模块app中的build.gradle中配置:

1.apply plugin: ‘kotlin-kapt’//kapt 插件

2.//开启dataBinding

android {   

dataBinding {
        enabled = true

    }

}

dependencies {
implementation”org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version”
“com.android.databinding:compiler:$gradle_version”
}

注意:

kapt “com.android.databinding:compiler:$gradle_version” 如果AndroidStudio是3.2以上版本,就不用使用kapt,直接”com.android.databinding:compiler:$gradle_version” ,不然编译时会报异常:[kapt] An exception occurred: java.lang.NullPointerException 这是因为:Android studio 3.2.0-beta01开始,数据绑定不再需要在gradle文件中声明其注释处理器依赖项,因为数据绑定能够解析其依赖性。

二、验证Databinding的配置

1.我们修改布局文件:activity_main.xml,布局文件这里一定要改成layout开始的才行:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="hello kotlin"/>
    </LinearLayout>
</layout>

2.然后我们来看下MainActivity:

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
}
}

注意:setContentView<ActivityMainBinding>中的ActivityMainBinding是对应xml布局文件的,如:R.laiyout.activity_main,这里如果没有配置和Databinging会提示找不到 ActivityMainBinding,也就是如果配置好Databinging,项目会自动生成ActivityMainBinding文件


三、Databinding的使用

1.我们先建一个数据实体类:

package com.hugecore.mojidict

class Person(val name: String, val sex: String){}

2.在布局文件中使用数据:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="person"
            type="com.hugecore.mojidict.Person" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="@{person.name}"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="@{person.sex}"/>
    </LinearLayout>
</layout>

3.在activity中使用:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val dataBinding = DataBindingUtil.setContentView<ActivityMainBinding>(this,R.layout.activity_main)
        dataBinding.person = Person("kotlin","women")

    }
}

4、在RecycleView中的使用

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    val context = parent.context
    val itemNews = DataBindingUtil.inflate<ItemNewsListVmBinding>(LayoutInflater.from(context),
                R.layout.item_news_list_vm,
                parent,
                false)
    return ArticleChoicenessViewHolder(itemNews.root)
   
}

5、RecycleView+DataBinding 数据刷新时屏幕闪一下的问题解决办法如下

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

    val articleBinding = DataBindingUtil.getBinding<ItemNewsListVmBinding>(holder.itemView)
    articleBinding?.executePendingBindings()

}

6、adapter中Imageview的用法如下

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

    <data>
        <variable
            name="article"
            type="com.hugecore.mojidict.core.model.Article" />
    </data>

          <com.makeramen.roundedimageview.RoundedImageView
                android:id="@+id/icon"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_centerVertical="true"
                android:scaleType="center"
                articleCoverImgUrl="@{article.coverId}"
                app:riv_corner_radius="10dp"
                app:riv_border_color="#FFFFFF"/>
</layout>

@BindingAdapter(value = ["articleCoverImgUrl"])
@JvmStatic
fun articleCoverImg(view: ImageView, identity: String) {
    view.loadImage(view.context, view, ImageType.ARTICLE_ALBUM, identity, null)
}

SourceTree + GitLab Enterprise Edition 项目导入

一、SourceTree 安装

直接在 SourceTree 官网 https://www.sourcetreeapp.com/ 下载安装适合自己系统的版本,之前 SourceTree 客户端不需要创建账号之类的,可以直接进行 git 地址 clone,最近版本需要进行账号登陆,如果没有账号创建一个,如果有账号,也可以用其他人的账号进行安装。

二、GitLab 配置

SourceTree 支持账号登陆,也支持最原始的 SSH Key 进行登陆,如果是公司内部搭建的而且是没有做过任何修改的企业版,如果要支持账号登陆就需要支持双重认证。

You can also use personal access tokens to authenticate against Git over HTTP. They are the only accepted password when you have Two-Factor Authentication (2FA) enabled.

如果没有开启双重认证就会提示你验证失败。于是只好选择 SSH Key 方式,通过自己生成 SSH Key 在默认用户录下

步骤1.检查是否已经存在SSH Key

打开电脑终端,输入以下命令:

ls -al ~/.ssh   

会出现两种情况  

步骤2. 生成/设置SSH Key

继续上一步可能出现的情况   

(1)情况一:终端出现文件id_rsa.pub 或 id_dsa.pub,则表示该电脑已经存在SSH Key,此时可继续输入命令:

这样你需要的SSH Key 就已经复制到粘贴板上了,然后进行步骤3

< ~/.ssh/id_rsa.pub  

(2)情况二:终端未出现id_rsa.pub 或 id_dsa.pub文件,表示该电脑还没有配置SSH Key,此时需要输入命令:

ssh-keygen -t rsa -C “your_email@example.com”  

选一般的常用的邮箱即可,不常用的邮箱一般不推荐)            

 默认会在相应路径下(/your_home_path)生成id_rsa和id_rsa.pub两个文件,此时终端会显示:

连续回车即可,也可能会让你输入密码,密码就是你的开机密码 

然后把公钥放在Gitlab 上面的个人设置 SSH Keys 选项中。

三、git 项目导入

因为 SourceTree 默认认为你有 git 命令支持,假如电脑里面没有 git 环境,是不能够通过 SourceTree 的 git 地址直接 clone 的,没有任何提示。

这个时候就需要用 Mac 或者 Windows 的命令终端去查看支不支持git 命令,Window 如果没有安装那就需要主动去安装 git,Mac 上面如果没有安装,使用 git 命令时会提示你安装,当然你也可以自己去官网下载安装,并且配置 git 路径。

安装好 git 之后,直接在 gitlab 项目里面拷贝 git 地址到 SourceTree 的通过 url clone 项目的选项,可以自定义项目路径,然后点击克隆即可。

四、git 项目提交测试

一般拉取权限很低不需要用到 SSH Key,提交权限需要用到 SSH Key。这个时候通过确定提交是否成功来查看 SSH Key 配置的正确。如果本地提交成功,可以通过 gitlab 网页查看操作是否成功,如果失败那就可能需要重新配置 SSH Key。