Kotlin Android Extensions是Kotlin团队开发的一个插件,目的是让咱们在开发过程当中更少的编写代码。目前包括了视图绑定的功能。 android
几种绑定视图方式对比app
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:gravity="center" > <Button android:id="@+id/btn_login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登陆" /> </LinearLayout>
private lateinit var mLoginBtn:Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mLoginBtn = findViewById(R.id.btn_login) as Button mLoginBtn.setOnClickListener { Toast.makeText(this@MainActivity,"登陆",Toast.LENGTH_SHORT).show() } }
在这种方式里面,通常状况下咱们会定义一个成员变量来接收视图,同时使用findViewById并作一次类型转换。框架
/* 引入编译插件和依赖包。略过... */ @BindView(R.id.btn_login) lateinit var mLoginBtn:Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) ButterKnife.bind(this) mLoginBtn.setOnClickListener { Toast.makeText(this@MainActivity,"登陆",Toast.LENGTH_SHORT).show() } }
能够看到,使用ButterKnife,不但要引入它的编译插件和库文件,在绑定视图的过程当中,依然须要定义成员变量,代码量并无减小。ide
1)、在Module中的build.gradle文件添加插件配置布局
apply plugin: 'kotlin-android-extensions'
2)、在须要绑定视图的Activity、Fragment、Adapter及自定义View中引入资源文件gradle
import kotlinx.android.synthetic.main.activity_main.*
3)、 在使用的位置,直接使用xml中对应的id访问视图,完整代码以下:ui
import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) btn_login.setOnClickListener { Toast.makeText(this@MainActivity,"登陆",Toast.LENGTH_SHORT).show() } } }
引入文件详细说明this
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.btn_login
import kotlinx.android.synthetic.main.view_login.view.*
Kotlin插件绑定视图范围插件
import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) btn_login.setOnClickListener { Toast.makeText(this@MainActivity,"登陆",Toast.LENGTH_SHORT).show() } } }
import kotlinx.android.synthetic.main.view_login.* class LoginFragment:Fragment() { override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) return inflater?.inflate(R.layout.view_login, container, false) } override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) btn_login.setOnClickListener { Toast.makeText(context,"登陆", Toast.LENGTH_SHORT).show() } } }
import kotlinx.android.synthetic.main.view_login.view.* class LoginAdapter(var context: Context):RecyclerView.Adapter<LoginAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder { val view = LayoutInflater.from(context) .inflate(R.layout.view_login,parent,false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.itemView.btn_login.setOnClickListener { Toast.makeText(context,"登陆", Toast.LENGTH_SHORT).show() } } override fun getItemCount(): Int { return 3 } class ViewHolder(view: View) : RecyclerView.ViewHolder(view) }
import kotlinx.android.synthetic.main.view_login.view.* class LoginView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr) { init { View.inflate(context,R.layout.view_login,this) btn_login.setOnClickListener { Toast.makeText(context,"登陆", Toast.LENGTH_SHORT).show() } } }
做者:雷宇_
连接:http://www.imooc.com/article/21913
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合做指针