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
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做指針