Fix Android monitor scroll stability
This commit is contained in:
@@ -10,7 +10,7 @@ android {
|
|||||||
applicationId = "xyz.kusoft.tradebotmonitor"
|
applicationId = "xyz.kusoft.tradebotmonitor"
|
||||||
minSdk = 26
|
minSdk = 26
|
||||||
targetSdk = 36
|
targetSdk = 36
|
||||||
versionCode = 1
|
versionCode = 2
|
||||||
versionName = "0.1.0"
|
versionName = "0.1.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+31
-5
@@ -39,6 +39,7 @@ class MainActivity : Activity() {
|
|||||||
private var lastError: String = ""
|
private var lastError: String = ""
|
||||||
private var activeTab: String = "markets"
|
private var activeTab: String = "markets"
|
||||||
private var palette: AppPalette = AppPalette.dark()
|
private var palette: AppPalette = AppPalette.dark()
|
||||||
|
private val scrollPositions = mutableMapOf<String, Int>()
|
||||||
|
|
||||||
private val refreshRunnable = object : Runnable {
|
private val refreshRunnable = object : Runnable {
|
||||||
override fun run() {
|
override fun run() {
|
||||||
@@ -127,9 +128,12 @@ class MainActivity : Activity() {
|
|||||||
).forEach { (id, title) ->
|
).forEach { (id, title) ->
|
||||||
tabBar.addView(
|
tabBar.addView(
|
||||||
button(title, selected = activeTab == id) {
|
button(title, selected = activeTab == id) {
|
||||||
activeTab = id
|
if (activeTab != id) {
|
||||||
renderTabs()
|
saveCurrentScroll()
|
||||||
render()
|
activeTab = id
|
||||||
|
renderTabs()
|
||||||
|
render(saveScroll = false)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
LinearLayout.LayoutParams(0, dp(38), 1f).apply { setMargins(dp(3), 0, dp(3), 0) },
|
LinearLayout.LayoutParams(0, dp(38), 1f).apply { setMargins(dp(3), 0, dp(3), 0) },
|
||||||
)
|
)
|
||||||
@@ -150,7 +154,11 @@ class MainActivity : Activity() {
|
|||||||
styleLabel(statusView, if (data.ok && data.running) "ok" else "warn")
|
styleLabel(statusView, if (data.ok && data.running) "ok" else "warn")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun render() {
|
private fun render(saveScroll: Boolean = true) {
|
||||||
|
val tabForRender = activeTab
|
||||||
|
if (saveScroll) {
|
||||||
|
saveCurrentScroll(tabForRender)
|
||||||
|
}
|
||||||
contentHost.removeAllViews()
|
contentHost.removeAllViews()
|
||||||
val view = when (activeTab) {
|
val view = when (activeTab) {
|
||||||
"overview" -> overviewScreen()
|
"overview" -> overviewScreen()
|
||||||
@@ -159,6 +167,23 @@ class MainActivity : Activity() {
|
|||||||
else -> marketsScreen()
|
else -> marketsScreen()
|
||||||
}
|
}
|
||||||
contentHost.addView(view)
|
contentHost.addView(view)
|
||||||
|
restoreScroll(view, tabForRender)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun saveCurrentScroll(tabId: String = activeTab) {
|
||||||
|
val current = contentHost.getChildAt(0)
|
||||||
|
if (current is ScrollView) {
|
||||||
|
scrollPositions[tabId] = current.scrollY
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun restoreScroll(view: View, tabId: String) {
|
||||||
|
if (view !is ScrollView) return
|
||||||
|
val savedY = scrollPositions[tabId] ?: 0
|
||||||
|
view.post {
|
||||||
|
val maxY = (view.getChildAt(0)?.height ?: 0) - view.height
|
||||||
|
view.scrollTo(0, savedY.coerceIn(0, maxOf(0, maxY)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun overviewScreen(): View {
|
private fun overviewScreen(): View {
|
||||||
@@ -610,7 +635,8 @@ class MainActivity : Activity() {
|
|||||||
background = boxDrawable(if (selected) palette.blue else palette.panelAlt, if (selected) palette.blue else palette.line, 5)
|
background = boxDrawable(if (selected) palette.blue else palette.panelAlt, if (selected) palette.blue else palette.line, 5)
|
||||||
setOnClickListener { onClick() }
|
setOnClickListener { onClick() }
|
||||||
isClickable = true
|
isClickable = true
|
||||||
isFocusable = true
|
isFocusable = false
|
||||||
|
isFocusableInTouchMode = false
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun label(title: String, kind: String): TextView =
|
private fun label(title: String, kind: String): TextView =
|
||||||
|
|||||||
Reference in New Issue
Block a user