refactor(app): 重构代码表页面布局和功能

- 更新 activity_code_table.xml 布局,简化结构并添加工具栏
- 重写 CodeTableAdapter,改为使用 BaseExpandableListAdapter
-移除 CodeTableItemAdapter,直接在 CodeTableAdapter 中处理条目布局
- 更新代码表项布局,使用新的 code_table_group.xml 文件
- 优化搜索和过滤功能,使用 InputDialog 替代原有的搜索框
- 改进代码示例展示方式,使用 MaterialAlertDialog 替代底部对话框
- 优化类型信息展示,根据开发者模式显示不同内容
This commit is contained in:
Cold-Mint 2025-02-09 10:17:54 +08:00
parent 5f137e0469
commit 5d4b9c7d29
Signed by: Cold-Mint
GPG Key ID: C5A9BF8A98E0CE99
6 changed files with 296 additions and 530 deletions

View File

@ -1,25 +1,18 @@
package com.coldmint.rust.pro
import android.annotation.SuppressLint
import android.graphics.Color
import android.os.Bundle
import android.text.Editable
import android.text.Spannable
import android.text.SpannableString
import android.text.TextWatcher
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.inputmethod.EditorInfo
import android.view.*
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import com.coldmint.dialog.InputDialog
import com.coldmint.rust.core.database.code.CodeDataBase
import com.coldmint.rust.core.database.code.CodeInfo
import com.coldmint.rust.core.database.code.SectionInfo
import com.coldmint.rust.pro.adapters.CodeTableAdapter
import com.coldmint.rust.pro.adapters.CodeTableItemAdapter
import com.coldmint.rust.pro.base.BaseActivity
import com.coldmint.rust.pro.databinding.ActivityCodeTableBinding
import java.util.concurrent.Executors
@ -30,76 +23,11 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
override fun whenCreateActivity(savedInstanceState: Bundle?, canUseView: Boolean) {
if (canUseView) {
title = getString(R.string.code_table)
viewBinding.edittext.hint = title
setReturnButton()
loadData()
//设置上下选择按钮
viewBinding.listTop.setOnClickListener {
if (CodeTableAdapter.picklist.isEmpty()) {
return@setOnClickListener
}
if (--CodeTableAdapter.pick < 0) {
CodeTableAdapter.pick = 0
}
val get = CodeTableAdapter.picklist[CodeTableAdapter.pick]
(viewBinding.codeRecyclerB.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(get, 0)
}
viewBinding.listButtom.setOnClickListener {
if (CodeTableAdapter.picklist.isEmpty()) {
return@setOnClickListener
}
val size = CodeTableAdapter.picklist.size
if (++CodeTableAdapter.pick == size - 1) {
CodeTableAdapter.pick = 0
}
val get = CodeTableAdapter.picklist[CodeTableAdapter.pick]
(viewBinding.codeRecyclerB.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(get,
0)
}
viewBinding.edittext.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(a: CharSequence?, p1: Int, p2: Int, p3: Int) {
}
override fun onTextChanged(a: CharSequence?, p1: Int, p2: Int, p3: Int) {
/* if (a.isNullOrEmpty()) {
loadData()
return
}
loadData(a.toString())*/
if (a.isNullOrEmpty()) {
viewBinding.searchPick.isVisible = false
loadData()
}
}
override fun afterTextChanged(a: Editable?) {
}
})
viewBinding.edittext.setOnEditorActionListener { v, p1, _ ->
if (p1 == EditorInfo.IME_ACTION_SEARCH) {
if (v?.text.isNullOrEmpty()) {
loadData()
} else {
var toString = v?.text.toString()
if (toString.startsWith("/")) {
toString = toString.substring(1)
loadData(toString)
} else {
viewBinding.searchPick.isVisible = true
adapter.item?.search(toString)
}
}
}
false
}
viewBinding.back.setOnClickListener { moveTaskToBack(true) }
}
}
/*
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_DOWN) {
@ -108,16 +36,22 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
}
return super.onKeyDown(keyCode, event)
}
*/
fun ifNeedFinish() {
if (filterMode) {
loadData()
} else {
finish()
}
}
/**
* 加载数据
* @param key String?
* @param section String?
*/
fun loadData(key: String? = null, section: String? = null) {
//如果 key start 有 / 则取后的string
executorService.submit {
filterMode = key != null || section != null
val sectionMap = HashMap<String, String>()
@ -158,7 +92,7 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
codeDataBase.getCodeDao()
.findCodeByCodeOrTranslateFromSection(key, section.code)
}
if (list.isNullOrEmpty()) {
if (list == null || list.isEmpty()) {
group.remove(section)
} else {
item.add(list)
@ -166,33 +100,18 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
}
if (group.isNotEmpty()) {
adapter = CodeTableAdapter(this, group, item, viewBinding)
val adapter = CodeTableAdapter(this, group, item)
adapter.setVersionMap(versionMap)
adapter.setTypeNameMap(typeNameMap)
adapter.setSectionMap(sectionMap)
if (adapter.item == null) {
adapter.item = CodeTableItemAdapter(viewBinding.codeRecyclerB, item[0])
adapter.item!!.versionMap = versionMap
adapter.item!!.typeNameMap = typeNameMap
adapter.item!!.sectionMap = sectionMap
CodeTableAdapter.i = group[0].translate
}
runOnUiThread {
viewBinding.codeRecyclerB.adapter = adapter.item
/* adapter.labelFunction = { _, _, string ->
// section = string
if (string.isEmpty()) {
loadData()
adapter.labelFunction = { index, view, string ->
loadData(section = string)
}
loadData(string)
}*/
viewBinding.displayView.isVisible = false
viewBinding.progressBar.isVisible = false
viewBinding.expandableListView.isVisible = true
viewBinding.expandableListView.layoutManager = LinearLayoutManager(this)
viewBinding.expandableListView.adapter = adapter
// viewBinding.expandableListView.swapAdapter(adapter, true)
viewBinding.expandableListView.setAdapter(adapter)
}
} else {
notFindKey(key)
@ -200,15 +119,12 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
}
}
lateinit var adapter: CodeTableAdapter
/**
* 没有找到节
* @param key String?
*/
@SuppressLint("StringFormatInvalid")
private fun notFindKey(key: String?) {
if (!key.isNullOrBlank()) {
fun notFindKey(key: String?) {
if (key != null && key.isNotBlank()) {
val tip = String.format(getString(R.string.not_find_code_name), key)
val action = getString(R.string.not_find_units_action)
val start = tip.indexOf(action)
@ -222,8 +138,8 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
}, start, start + action.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
viewBinding.displayView.movementMethod = LinkMovementMethod.getInstance()
viewBinding.displayView.highlightColor = Color.parseColor("#36969696")
viewBinding.displayView.movementMethod = LinkMovementMethod.getInstance();
viewBinding.displayView.highlightColor = Color.parseColor("#36969696");
viewBinding.displayView.text = spannableString
}
@ -232,16 +148,36 @@ class CodeTableActivity : BaseActivity<ActivityCodeTableBinding>() {
viewBinding.progressBar.isVisible = false
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_code_table, menu)
val inflater = menuInflater
inflater.inflate(R.menu.menu_code_table, menu)
return true
}
@Deprecated("Deprecated in Java", ReplaceWith("moveTaskToBack(true)"))
override fun onBackPressed() {
//显示桌面
moveTaskToBack(true)
// ifNeedFinish()
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.filter_units -> {
InputDialog(this).setTitle(R.string.filter).setMessage(R.string.filter_tip)
.setInputCanBeEmpty(false).setMaxNumber(20)
.setPositiveButton(R.string.dialog_ok) { text ->
var key = text
if (key.length > 20) {
key = key.substring(0, 20)
}
loadData(key)
true
}.setNegativeButton(R.string.dialog_close) {
}.show()
}
android.R.id.home -> {
ifNeedFinish()
return true
}
}
return super.onOptionsItemSelected(item)
}
override fun getViewBindingObject(layoutInflater: LayoutInflater): ActivityCodeTableBinding {

View File

@ -1,30 +1,55 @@
package com.coldmint.rust.pro.adapters
import android.annotation.SuppressLint
import android.content.Context
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import android.widget.BaseExpandableListAdapter
import androidx.core.view.isVisible
import com.afollestad.materialdialogs.MaterialDialog
import com.coldmint.rust.core.database.code.CodeDataBase
import com.coldmint.rust.core.database.code.CodeInfo
import com.coldmint.rust.core.database.code.SectionInfo
import com.coldmint.rust.core.tool.LineParser
import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.base.BaseVh
import com.coldmint.rust.pro.databinding.ActivityCodeTableBinding
import com.coldmint.rust.pro.databinding.ItemCodetableBinding
import com.coldmint.rust.pro.databinding.CodeTableGroupBinding
import com.coldmint.rust.pro.databinding.CodeTableItemBinding
import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.pro.tool.GlobalMethod
import com.google.android.material.chip.Chip
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import java.util.concurrent.Executors
class CodeTableAdapter(
val context: Context,
private val group: List<SectionInfo>,
private val itemList: List<List<CodeInfo>>,
private val binding: ActivityCodeTableBinding
) : RecyclerView.Adapter<BaseVh<ItemCodetableBinding>>() {
private val itemList: List<List<CodeInfo>>
) : BaseExpandableListAdapter() {
private val layoutInflater = LayoutInflater.from(context)
private var versionMap: HashMap<Int, String>? = null
private var typeNameMap: HashMap<String, String>? = null
private var sectionMap: HashMap<String, String>? = null
private val executorService by lazy {
Executors.newSingleThreadExecutor()
}
private val lineParser = LineParser()
//Label点击事件
var labelFunction: ((Int, View, String) -> Unit)? = null
private val developerMode by lazy {
AppSettings
.getValue(AppSettings.Setting.DeveloperMode, false)
}
init {
lineParser.symbol = ","
}
/**
* 节名映射
* @param sectionMap HashMap<String, String>
@ -33,6 +58,7 @@ class CodeTableAdapter(
this.sectionMap = sectionMap
}
/**
* 设置类型名称映射
* @param typeNameMap HashMap<String, String>?
@ -49,73 +75,174 @@ class CodeTableAdapter(
this.versionMap = versionMap
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): BaseVh<ItemCodetableBinding> {
return BaseVh(
ItemCodetableBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
}
override fun getItemCount(): Int {
override fun getGroupCount(): Int {
return group.size
}
companion object {
var i: String = null.toString()
var pick: Int = 0
var pickString: String = ""
var picklist: MutableList<Int> = mutableListOf()
override fun getChildrenCount(groupPosition: Int): Int {
return itemList[groupPosition].size
}
var item: CodeTableItemAdapter? = null
init {
lineParser.symbol = ","
override fun getGroup(groupPosition: Int): Any {
return group[groupPosition]
}
@SuppressLint("NotifyDataSetChanged", "StringFormatInvalid")
override fun onBindViewHolder(holder: BaseVh<ItemCodetableBinding>, position: Int) {
holder.binging.title.text = group[position].translate
val format = String.format(
override fun getChild(groupPosition: Int, childPosition: Int): Any {
return itemList[groupPosition][childPosition]
}
override fun getGroupId(groupPosition: Int): Long {
return groupPosition.toLong()
}
override fun getChildId(groupPosition: Int, childPosition: Int): Long {
return childPosition.toLong()
}
override fun hasStableIds(): Boolean {
return false
}
override fun getGroupView(
groupPosition: Int,
isExpanded: Boolean,
convertView: View?,
parent: ViewGroup
): View {
val resultView: CodeTableGroupBinding =
CodeTableGroupBinding.inflate(layoutInflater, parent, false)
val info =
String.format(
context.getString(R.string.filenum),
itemList[position].size
)
holder.binging.message.text = format
holder.itemView.setOnClickListener {
val finalPosition = holder.layoutPosition
i = group[finalPosition].translate
pick = 0
pickString = ""
picklist.clear()
if (item != null) {
item!!.list = itemList[position]
binding.codeRecyclerB.adapter = item
}
notifyItemChanged(finalPosition)
}
if (group[position].translate == i) {
//背景高亮
holder.binging.root.setCardBackgroundColor(
GlobalMethod.getThemeColor(
context,
com.google.android.material.R.attr.colorPrimaryContainer
)
)
} else {
//背景恢复
holder.binging.root.setCardBackgroundColor(
GlobalMethod.getThemeColor(
context,
com.google.android.material.R.attr.colorSurface
)
itemList[groupPosition].size
)
resultView.nameView.text = group[groupPosition].translate
resultView.numView.text = info
return resultView.root
}
override fun getChildView(
groupPosition: Int,
childPosition: Int,
isLastChild: Boolean,
convertView: View?,
parent: ViewGroup
): View {
val resultView: CodeTableItemBinding =
CodeTableItemBinding.inflate(layoutInflater, parent, false)
val codeInfo = itemList[groupPosition][childPosition]
// resultView.belongStackLabelView.onLabelClickListener = OnLabelClickListener { index, v, s ->
// }
resultView.descriptionView.text = codeInfo.description
resultView.descriptionView.setOnClickListener {
GlobalMethod.copyText(context, codeInfo.description, it)
}
resultView.titleView.text = codeInfo.translate
resultView.titleView.setOnClickListener {
GlobalMethod.copyText(context, codeInfo.translate, it)
}
val demo = codeInfo.demo
resultView.imageView.isVisible = demo.isNotBlank()
resultView.imageView.setOnClickListener {
val dialog = MaterialAlertDialogBuilder(context);
dialog.setTitle(R.string.code_demo)
dialog.setMessage(demo)
dialog.setPositiveButton(R.string.dialog_ok){
v,a->
}
dialog.show()
}
resultView.subTitleView.text = codeInfo.code
resultView.subTitleView.setOnClickListener {
GlobalMethod.copyText(context, codeInfo.code, it)
}
resultView.valueTypeView.text = typeNameMap?.get(codeInfo.type) ?: codeInfo.type
lineParser.text = codeInfo.section
resultView.chipGroup.removeAllViews()
var isNotEmpty = false
lineParser.analyse { lineNum, lineData, isEnd ->
isNotEmpty = true
val text = sectionMap?.get(lineData) ?: lineData
val chip = Chip(context)
chip.text = text
chip.setOnClickListener {
labelFunction?.invoke(lineNum, it, text)
}
resultView.chipGroup.addView(chip)
true
}
resultView.chipGroup.isVisible = isNotEmpty
resultView.valueTypeView.setOnClickListener {
val handler = Handler(Looper.getMainLooper())
executorService.submit {
val codeDataBase = CodeDataBase.getInstance(context)
val typeInfo = codeDataBase.getValueTypeDao().findTypeByType(codeInfo.type)
if (typeInfo == null) {
handler.post {
handler.post {
MaterialDialog(context).show {
title(text = codeInfo.type).message(
text = String.format(
context.getString(
R.string.unknown_type
), codeInfo.type
)
)
.positiveButton(R.string.dialog_ok)
}
}
}
} else {
if (developerMode) {
val stringBuilder = StringBuilder()
stringBuilder.append("介绍:")
stringBuilder.append(typeInfo.describe)
stringBuilder.append("\n附加信息:")
stringBuilder.append(typeInfo.external)
stringBuilder.append("\n关联的自动提示:")
stringBuilder.append(typeInfo.list)
stringBuilder.append("\n光标偏差:")
stringBuilder.append(typeInfo.offset)
stringBuilder.append("\n标签:")
stringBuilder.append(typeInfo.tag)
stringBuilder.append("\n数据规则:")
stringBuilder.append(typeInfo.rule)
handler.post {
MaterialDialog(context).show {
title(text = typeInfo.name + "(开发者模式)").message(text = stringBuilder.toString())
.positiveButton(R.string.dialog_ok)
}
}
} else {
if (typeInfo.describe == "@search(code)") {
handler.post {
MaterialDialog(context).show {
title(text = typeInfo.name).message(text = codeInfo.description)
.positiveButton(R.string.dialog_ok)
}
}
} else {
handler.post {
MaterialDialog(context).show {
title(text = typeInfo.name).message(text = typeInfo.describe)
.positiveButton(R.string.dialog_ok)
}
}
}
}
}
}
}
resultView.versionView.text =
versionMap?.get(codeInfo.addVersion) ?: codeInfo.addVersion.toString()
return resultView.root
}
override fun isChildSelectable(groupPosition: Int, childPosition: Int): Boolean {
return true
}
}

View File

@ -1,225 +0,0 @@
package com.coldmint.rust.pro.adapters
import android.annotation.SuppressLint
import android.graphics.Color
import android.os.Handler
import android.os.Looper
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.style.BackgroundColorSpan
import android.text.style.ForegroundColorSpan
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.afollestad.materialdialogs.MaterialDialog
import com.coldmint.rust.core.database.code.CodeDataBase
import com.coldmint.rust.core.database.code.CodeInfo
import com.coldmint.rust.core.tool.LineParser
import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.base.BaseVh
import com.coldmint.rust.pro.databinding.CodeTableItemBinding
import com.coldmint.rust.pro.dialog.MaterialBottomDialog
import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.pro.tool.GlobalMethod
import com.google.android.material.chip.Chip
import java.util.concurrent.Executors
class CodeTableItemAdapter(val recyclerView: RecyclerView,
var list: List<CodeInfo>) : RecyclerView.Adapter<BaseVh<CodeTableItemBinding>>() {
private val lineParser = LineParser()
init {
lineParser.symbol = ","
}
var labelFunction: ((Int, View, String) -> Unit)? = null
var versionMap: HashMap<Int, String>? = null
var typeNameMap: HashMap<String, String>? = null
var sectionMap: HashMap<String, String>? = null
private val executorService by lazy {
Executors.newSingleThreadExecutor()
}
private val developerMode by lazy {
AppSettings
.getValue(AppSettings.Setting.DeveloperMode, false)
}
//在list查找是否有这个关键字
fun search(keyword: String) {
CodeTableAdapter.pickString = keyword
CodeTableAdapter.pick = 0
CodeTableAdapter.picklist.clear()
for (i in list.indices) {
if (list[i].translate.contains(keyword) || list[i].description.contains(keyword) || list[i].code.contains(keyword)) {
CodeTableAdapter.picklist.add(i)
}
}
(recyclerView.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(CodeTableAdapter.pick, 0)
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseVh<CodeTableItemBinding> {
return BaseVh(CodeTableItemBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
override fun getItemCount(): Int {
return list.size
}
private fun contains(string: String, textView: TextView) {
if (string.contains(CodeTableAdapter.pickString)) {
val spannableText = SpannableStringBuilder(string)
val highlightWord = CodeTableAdapter.pickString
val start = string.indexOf(highlightWord)
val end = start + highlightWord.length
if (start != -1) {
// 设置文字颜色
val colorSpan = ForegroundColorSpan(Color.RED)
spannableText.setSpan(colorSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
// 设置背景颜色
val backgroundSpan = BackgroundColorSpan(Color.YELLOW)
spannableText.setSpan(backgroundSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
textView.text = spannableText
} else {
textView.text = string
}
}
private fun containsB(string: String, textView: TextView) {
if (string.contains(CodeTableAdapter.pickString)) {
val spannableText = SpannableStringBuilder(string)
val highlightWord = CodeTableAdapter.pickString
val start = string.indexOf(highlightWord)
val end = start + highlightWord.length
if (start != -1) {
// 设置文字颜色
val colorSpan = ForegroundColorSpan(Color.RED)
spannableText.setSpan(colorSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
// 设置背景颜色
val backgroundSpan = BackgroundColorSpan(Color.BLUE)
spannableText.setSpan(backgroundSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
textView.text = spannableText
} else {
textView.text = string
}
}
@SuppressLint("StringFormatInvalid")
override fun onBindViewHolder(holder: BaseVh<CodeTableItemBinding>, position: Int) {
val context = holder.itemView.context
val resultView: CodeTableItemBinding = holder.binging
val codeInfo = list[position]
contains(codeInfo.description, resultView.descriptionView)
resultView.descriptionView.setOnClickListener {
GlobalMethod.copyText(it.context, codeInfo.description, it)
}
contains(codeInfo.translate, resultView.titleView)
resultView.titleView.setOnClickListener {
GlobalMethod.copyText(it.context, codeInfo.translate, it)
}
val demo = codeInfo.demo
resultView.imageView.isVisible = demo.isNotBlank()
resultView.imageView.setOnClickListener {
val materialBottomDialog = MaterialBottomDialog(it.context)
materialBottomDialog.setTitle(R.string.code_demo)
materialBottomDialog.setMessage(demo)
materialBottomDialog.show()
}
contains(codeInfo.code, resultView.subTitleView)
resultView.subTitleView.setOnClickListener {
GlobalMethod.copyText(it.context, codeInfo.code, it)
}
resultView.valueTypeView.text = typeNameMap?.get(codeInfo.type) ?: codeInfo.type
lineParser.text = codeInfo.section
var isNotEmpty = false
lineParser.analyse { lineNum, lineData, isEnd ->
isNotEmpty = true
val text = sectionMap?.get(lineData) ?: lineData
val chip = Chip(context)
chip.text = text
chip.setOnClickListener {
labelFunction?.invoke(lineNum, it, text)
}
// resultView.chipGroup.addView(chip)
true
}
// resultView.chipGroup.isVisible = isNotEmpty
resultView.valueTypeView.setOnClickListener {
val handler = Handler(Looper.getMainLooper())
executorService.submit {
val codeDataBase = CodeDataBase.getInstance(context)
val typeInfo = codeDataBase.getValueTypeDao().findTypeByType(codeInfo.type)
if (typeInfo == null) {
handler.post {
handler.post {
MaterialDialog(context).show {
title(text = codeInfo.type).message(
text = String.format(
context.getString(
R.string.unknown_type
), codeInfo.type
)
)
.positiveButton(R.string.dialog_ok)
}
}
}
} else {
if (developerMode) {
val stringBuilder = StringBuilder()
stringBuilder.append("介绍:")
stringBuilder.append(typeInfo.describe)
stringBuilder.append("\n附加信息:")
stringBuilder.append(typeInfo.external)
stringBuilder.append("\n关联的自动提示:")
stringBuilder.append(typeInfo.list)
stringBuilder.append("\n光标偏差:")
stringBuilder.append(typeInfo.offset)
stringBuilder.append("\n标签:")
stringBuilder.append(typeInfo.tag)
stringBuilder.append("\n数据规则:")
stringBuilder.append(typeInfo.rule)
handler.post {
MaterialDialog(context).show {
title(text = typeInfo.name + "(开发者模式)").message(text = stringBuilder.toString())
.positiveButton(R.string.dialog_ok)
}
}
} else {
if (typeInfo.describe == "@search(code)") {
handler.post {
MaterialDialog(context).show {
title(text = typeInfo.name).message(text = codeInfo.description)
.positiveButton(R.string.dialog_ok)
}
}
} else {
handler.post {
MaterialDialog(context).show {
title(text = typeInfo.name).message(text = typeInfo.describe)
.positiveButton(R.string.dialog_ok)
}
}
}
}
}
}
}
resultView.versionView.text =
versionMap?.get(codeInfo.addVersion) ?: codeInfo.addVersion.toString()
}
}

View File

@ -1,97 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:card_view="http://schemas.android.com/tools"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
android:fitsSystemWindows="true"
tools:context=".ActivateActivity">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<com.google.android.material.card.MaterialCardView
style="@style/Widget.Material3.CardView.Elevated"
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="12dp">
android:layout_height="?attr/actionBarSize" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="6dp"
android:gravity="center">
<ImageView
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?android:selectableItemBackgroundBorderless"
android:focusable="true"
android:src="@drawable/md_nav_back"
android:tint="?android:attr/colorForeground"
tools:ignore="ContentDescription" />
<EditText
android:id="@+id/edittext"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:autofillHints="text"
android:background="@null"
android:drawableEnd="@drawable/ic_search_black_24dp"
android:hint="@string/search"
android:imeOptions="actionSearch"
android:inputType="text"
android:minHeight="48dp"
android:padding="10dp"
android:singleLine="true"
tools:ignore="TextContrastCheck,VisualLintTextFieldSize" />
</LinearLayout>
<LinearLayout
android:id="@+id/search_pick"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="6dp"
android:gravity="end"
android:orientation="horizontal"
android:visibility="gone"
tools:visibility="visible">
<ImageView
android:id="@+id/listTop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="3dp"
android:padding="9dp"
android:background="?selectableItemBackground"
android:src="@drawable/animator_expand_on" />
<ImageView
android:id="@+id/listButtom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:padding="9dp"
android:src="@drawable/animator_expand_off" />
</LinearLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</com.google.android.material.appbar.AppBarLayout>
<androidx.constraintlayout.widget.ConstraintLayout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginHorizontal="6dp"
android:layout_marginTop="3dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="8dp"
android:layout_marginRight="16dp"
android:animateLayoutChanges="true"
android:gravity="center"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
@ -99,52 +34,22 @@
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
android:layout_height="wrap_content" />
<TextView
android:id="@+id/displayView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/unable_open_database"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/progressBar"
tools:visibility="visible" />
android:visibility="gone" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.recyclerview.widget.RecyclerView
<ExpandableListView
android:id="@+id/expandableListView"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:visibility="gone" />
<com.google.android.material.divider.MaterialDivider
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginHorizontal="3dp"
android:layout_marginVertical="3dp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/code_recycler_b"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp">
<TextView
android:id="@+id/nameView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:text="表名"
android:textSize="16dp" />
<TextView
android:id="@+id/numView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="代码数" />
</RelativeLayout>

View File

@ -61,7 +61,7 @@
android:layout_marginLeft="8dp"
android:layout_toRightOf="@id/valueTypeView"
android:text="版本信息" />
<!--
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroup"
android:layout_width="match_parent"
@ -69,7 +69,8 @@
android:layout_below="@id/valueTypeView"
android:layout_marginTop="8dp"
app:singleLine="false">
</com.google.android.material.chip.ChipGroup>-->
</com.google.android.material.chip.ChipGroup>
</RelativeLayout>