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>