android kotlin笔记

65 阅读2分钟

1 动态设置背景色,背景形状

object DrawableHelper {
    fun createCircleDrawable(size:Int, color:Int):Drawable {
        val drawable = GradientDrawable()
        drawable.shape = GradientDrawable.OVAL
        drawable.setSize(size, size)
        drawable.setColor(color)
        return drawable
    }
}

2 http JSON解析

response.body?.let { body ->
    val json = JSONObject(body)
    val code = json.optInt("code")
    val msg = json.optString("msg")
    val data = json.optJSONObject("data")
    val list = data?.optJSONObject("list")
    
    
import org.json.JSONArray

try {
    val jsonStr = "{ "students": ["Alice", "Bob", "Tom"] }"
    val jsonObj = JSONObject(jsonStr)
    val jsonArray: JSONArray = jsonObj.getJSONArray("students")
    for (i in 0 until jsonArray.length()) {
        val student: String = jsonArray.getString(i)
        Log.d("Student", student)
    }
} catch (e: JSONException) {
    e.printStackTrace()
}

3 xml引入模块或者参数

<import type="android.view.View"/>
<import type="android.text.TextUtils"/>
<variable
    name="showDivider"
    type="java.lang.Boolean" />
 
<variable
    name="onResetSyncClick"
    type="android.view.View.OnClickListener" />

<import type="com.purui.mobile.BuildConfig"/>
 

4 data class使用继承方式扩展


open class FilterItem(open val text:String = "", open val selected:ObservableBoolean) {
}

data class TimeFilterItem(val StartTime:String, val EndTime:String, override val text: String, override val selected: ObservableBoolean,val index:Int?=0) :
    FilterItem(text, selected)

5.xml 的滚动视图列表item适配器,引入外部的viewmodel

//xml
<data>
    <import type="android.view.View"/>
    <variable
        name="model"
        type="com.xx.mobile.ui.main.view.adapter.StockingUpOrderDetailTagListAdapterModel" />
    <variable
        name="onDeleteClick"
        type="android.view.View.OnClickListener" />
    <variable
        name="vm"
        type="com.xx.mobile.ui.main.view.fragment.viewmodel.StockingUpViewModel" />
</data> 

//适配器 

@BindingAdapter(value = ["ListAdapter_bindlist",
    "ListAdapter_vm", ], requireAll = false)
fun StockingUpOrderDetailTagListAdapter_binding(
    view: RecyclerView,
    list: ObservableArrayList<ListAdapterModel>,
    vm: EpcsStockUpViewModel?= null,
) {  
val adapter = ListAdapter(list)
adapter.vm = vm 
}


6 . 动态设置ConstraintLayout布局因为visiable属性导致的相对性view不正常

vm.currentTabReady为viewModel里一个动态变量 val currentTabReady = ObservableInt(0)

<View
    View_layout_constraintEnd_toEndOf="@{vm.currentTabReady==0?@id/tv_tab_to_be_ready:@id/tv_tab_ready}"
    View_layout_constraintStart_toStartOf="@{vm.currentTabReady==0?@id/tv_tab_to_be_ready:@id/tv_tab_ready}"
    android:layout_width="0dp"
    android:layout_height="2dp"
    android:background="@color/global_color"
    app:layout_constraintEnd_toEndOf="@id/tv_tab_to_be_ready"
    app:layout_constraintStart_toStartOf="@id/tv_tab_to_be_ready"
    app:layout_constraintTop_toTopOf="@id/divider_bottom" />

bindingAdatpter动态配置对齐view :View_layout_constraintEnd_toEndOf 、 View_layout_constraintStart_toStartOf 实现如下

@BindingAdapter(value=["View_layout_constraintStart_toStartOf","View_layout_constraintEnd_toEndOf"])
fun View_layout_constraintStart_toStartOf(view:View, startToStartResId:Int, endToEndResId:Int) {
    val lp = view.layoutParams
    if (lp is ConstraintLayout.LayoutParams) {
        lp.startToStart = startToStartResId
        lp.endToEnd = endToEndResId
    }
    view.layoutParams = lp
}

7. 协程async与await

async 是 CoroutineScope 扩展函数,async 和 launch 的区别在于async 可以返回协程结果,而 launch 不能。

async默认值 CoroutineStart.DEFAULT 协程在声明同时就被启动(实际上还需被调度执行,但可认为是立即就执行)

CoroutineStart.LAZY 不主动启动协程,直到主动调用async.await()或async.satrt()后才启动(懒加载模式) a.await() + b.await()导致两个协程顺序执行

  import kotlinx.coroutines.*
import kotlin.system.measureTimeMillis
 
fun main() {
    val time = measureTimeMillis {
        runBlocking {
            val a = async(start = CoroutineStart.LAZY) {
                delay(2000)
                1
            }
 
            val b = async(start = CoroutineStart.LAZY) {
                delay(3000)
                2
            }
 
            /* 打破CoroutineStart.LAZY懒加载,协程立即投入执行。
            a.start()
            b.start()
             */
            println(a.await() + b.await())
        }
    }
 
    println(time)
}

8.横向排列TextView文字过长时自动换行:tv_client自动换行

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools">
   <data>
       <import type="android.view.View"/>
       <variable
           name="model"
           type="com.xx.adapter.ListAdapterModel" />
   </data>
   <androidx.constraintlayout.widget.ConstraintLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content" 
       >
       <LinearLayout
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:minHeight="50dp"
           android:gravity="center_vertical"
           android:paddingStart="15dp"
           app:layout_constraintTop_toTopOf="parent"
           >
           <androidx.appcompat.widget.AppCompatTextView
               android:id="@+id/tv_good_name"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content" 
               tools:textColor="@color/font_color_dark"
               android:text="@{model.orderNo}"
               tools:text="RSO202302152545"
               />

           <androidx.appcompat.widget.AppCompatTextView
               android:id="@+id/tv_client"
               android:layout_width="0dp"
               android:layout_height="wrap_content"  
               android:layout_weight="2"
               android:text="@{model.clientName}"
               tools:text="越来越好酒店有限责任公司越来越好酒店有限责任公司越来越好酒店有限责任公司越来越好酒店有限责任公司越来越好酒店有限责任公司"
               android:paddingHorizontal="5dp"
               />
                 <androidx.appcompat.widget.AppCompatTextView
                   android:id="@+id/tv_status"
                   android:layout_width="0dp"
               android:layout_height="wrap_content"
               android:layout_weight="1.5"
                   android:text="@{model.status}"
                   tools:text="待备货"
                   />
        
       </LinearLayout>
       <View
           style="@style/horizontalDivider"
           android:layout_width="match_parent"
           android:layout_height="0.5dp"
           app:layout_constraintBottom_toBottomOf="parent"/>
   </androidx.constraintlayout.widget.ConstraintLayout>
</layout>