Linux編程
點擊右側關注,免費入門到精通!
作者丨前行的烏龜https://www.jianshu.com/p/bad802d5ad76
ps : 整理中 … 不要罵我啊
內容目錄
Toggle1. 解析 view 自定義屬性
這里的核心是 kotlin 對 list 的寫法和 Sequence 序列的應用,Sequence 序列會大大提升 list 處理速度,rxjava 式的調用感官是很 Nice 的。
privatefuninitAttrs(context:Context,attributeSet:AttributeSet?,defAttrStyle:Int){valtypedArray=context.obtainStyledAttributes(attributeSet,R.styleable.CustomeTextView)(0..typedArray.indexCount).asSequence().map{typedArray.getIndex(it)}.forEach{when(it){//獲取文字內容R.styleable.CustomeTextView_android_text->{mText=typedArray.getString(R.styleable.CustomeTextView_android_text)}//獲取文字大小R.styleable.CustomeTextView_android_textSize->{vartextSize=typedArray.getDimensionPixelSize(R.styleable.CustomeTextView_android_textSize,0).toFloat()mPaint.textSize=textSize}}}typedArray.recycle()}
2. 自定義 view 構造函數
@JvmOverloadsconstructor(context:Context,attributeSet:AttributeSet?=null,defAttrStyle:Int=0):super(context,attributeSet,defAttrStyle){//初始化畫筆initPaint()//初始化默認圖片資源initDrawable()//初始化各種自定義參數initAttrs(context,attributeSet,defAttrStyle)cauculateStartState()}
3. 用對象函數代替接口
kotlin 的把函數作為一個對象來使用,這樣極大的擴展了代碼了靈活度,很多時候減少了我們不少代碼量,但是也增加了學習難度。這里我們來用一個對象函數來替代一個 lisenter 接口
1.類內部聲明一個對象函數,並使用
openclassBook(varname:String):Cat(),Foo{//沒有返回值用UnitlateinitvargetData:(name:String,age:Int)->StringfunString.aact(str:String):String{returnname.aact(name)}
2.外部類做到這個對象函數
classMainActivity<T:String>:AppCompatActivity(){//方法一:傳遞一個聲明相同的方法,類似於做到接口方法book1.getData=this@MainActivity::getDatafungetData(name:String,age:Int):String{return"5555"}//方法二:做到匿名方法,先把參數再聲明一下,後面具體做到邏輯即可book1.getData={name:String,age:Int->text_name.toString()}}
4. 坑爹的 lateinit
lateinit 本身的含義是延遲初始化,但是在編譯時必須保證 lateinit 修飾的參數被初始化,否則編譯不過去的
今天就碰到了這個問題,我有個對象函數外接可能不會賦值的,我用的 lateinit 修飾的這個對象函數,結果死活編譯不過去,蛋疼死了
最後發現只能這麼寫:
//聲明時用?.nullvarmCallBack:MyWebViewCallBack?=null//使用時?.!!才行if(mCallBack!=null){result=mCallBack?.shouldOverrideUrlLoading(view,url)!!returnresult}
kotlin 的 null 操作
valname:String?//這里要吐槽下為什麼kotlin沒有三目運算符?name=if(Random.nextBoolean())"Ann"elsenull//加上?則只在name不為null的時候會調用,得到的len1類型也是有問號的,即Int?vallen1=name?.length//這種寫法是如果為空給一個默認值,得到的len2類型為Int,不帶問號vallen2=name?.length?:0//加上雙感嘆號其實就是java什麼都不加的寫法了,如果為null會報空指針異常vallen3=name!!.length
函數式編程
funAppCompatActivity.setupActionBar(@IdRestoolbarId:Int,action:ActionBar.()->Unit){valtoolbar=findViewById<Toolbar>(toolbarId)setSupportActionBar(toolbar)supportActionBar?.run{//執行參數中的函數,這樣用戶在調用該方法的時候更加靈活action()}toolbar.setNavigationOnClickListener{Log.d("AppCompatActivity","finish")finish()}}//------------------------分割線-----------------------------//類似的單方法接口現在只需要寫一個閉包就行了binding.aliPayIcon.setOnClickListener{Log.d("example",it.contentDescription.toString())}//擴展函數let,只有在對象不為空的時候會調用,相當於做了判空binding.let{it.setLifecycleOwner(this@WithdrawActivity)it.viewModel=vm}//擴展函數apply,在閉包內可直接調用對象的方法屬性,有個好處就是可以直接操作對象不需要先生成變量vm.accountName.apply{this.value="aaaa"Log.d("example",this.value?.toString()+":"+this.hashCode())}//還有其他基礎擴展函數run,with,also等等,可以看看這篇博客的介紹:https://www.jianshu.com/p/28ce69d58fea
推薦↓↓↓
長
按
關
註
?【16個技術公眾號】都在這里!
涵蓋:工程師大咖、源碼共讀、工程師共讀、數據結構與算法、黑客技術和網路安全、大數據科技、編程前端、Java、Python、Web編程開發、Android、iOS開發、Linux、數據庫研發、幽默工程師等。
萬水千山總是情,點個 「好看」 行不行





專注在 兩性、愛情等領域