老铁们好,最近要公司测试人员做一个测试工具,需要实现一个 console 来展示测试结果,简单实现了一下,备忘一下,以后有类似需求直接此处拿代码
其实现要点是
1 layout xml
使用一个 ScrollView 的目的是让这个 console 能滚动,否则容纳不了多少内容,其实 TextView 自己也能实现滚动,不过据我观察,效果不咋地
<ScrollView
android:id="@+id/mpt_console_container"
android:layout_width="match_parent"
android:layout_height="240dp"
android:background="@color/background_gray"
app:layout_constraintTop_toBottomOf="@id/mpt_log_title">
<TextView
android:id="@+id/mpt_console"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none" />
</ScrollView>
2 在 Activity 中我们把 View 找出来
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.{your-layout})
console = findViewById(R.id.mpt_console)
consoleScroller = findViewById(R.id.mpt_console_container)
。。。
}
3 封装一个 console 方法
直接把我们需要展示的信息 append 到 TextView 上,为了展示最新 log,我们给它自动滚动到底部
private fun console(msg: String) {
console.append("$msg\n\n")
consoleScroller.post { consoleScroller.fullScroll(View.FOCUS_DOWN) }
}
4 再给一个清除日志和复制日志的入口吧,放到右上角菜单里面,注意我们的 Activity 用得是 AppCompatActivity,这样,才能有 ActionBar 呦
private val groupId = 0
private val itemClearId = 1
private val itemCopyId = 2
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menu?.add(groupId, itemClearId, Menu.NONE, R.string.mpt_clear_log)
menu?.add(groupId, itemCopyId, Menu.NONE, R.string.mpt_copy_log)
return true
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
item ?: return false
when (item.itemId) {
itemClearId -> console.text = ""
itemCopyId -> {
(getSystemService(CLIPBOARD_SERVICE) as ClipboardManager).primaryClip = ClipData.newPlainText("", console.text)
toast(R.string.mpt_copy_success)
}
}
return true
}
是不是很简单呢,老铁们,以后遇到这样的需求直接来 copy 代码就行了,最终效果