Add scroll-to-top control for logs

This commit is contained in:
ajp_anton
2026-07-27 01:17:40 +00:00
parent 607e89938e
commit 931ff5830f
2 changed files with 42 additions and 19 deletions
@@ -29,6 +29,12 @@ class ViewLogsFragment : Fragment(R.layout.fragment_view_logs) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding = FragmentViewLogsBinding.bind(view) binding = FragmentViewLogsBinding.bind(view)
binding!!.logsRefresh.setOnRefreshListener(::loadLogs) binding!!.logsRefresh.setOnRefreshListener(::loadLogs)
binding!!.logScroll.setOnScrollChangeListener { _, _, scrollY, _, _ ->
binding?.scrollToTop?.visibility = if (scrollY > dp(SCROLL_TO_TOP_THRESHOLD_DP)) View.VISIBLE else View.GONE
}
binding!!.scrollToTop.setOnClickListener {
binding?.logScroll?.smoothScrollTo(0, 0)
}
loadLogs() loadLogs()
} }
@@ -236,5 +242,6 @@ class ViewLogsFragment : Fragment(R.layout.fragment_view_logs) {
private companion object { private companion object {
const val LEFT_PILL_WEIGHT = 0.42f const val LEFT_PILL_WEIGHT = 0.42f
const val RIGHT_PILL_WEIGHT = 0.58f const val RIGHT_PILL_WEIGHT = 0.58f
const val SCROLL_TO_TOP_THRESHOLD_DP = 120
} }
} }
+35 -19
View File
@@ -1,31 +1,47 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/logs_refresh"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<ScrollView <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/logs_refresh"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<LinearLayout <ScrollView
android:id="@+id/log_scroll"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent">
android:orientation="vertical"
android:padding="@dimen/page_padding">
<TextView
android:id="@+id/empty_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="No logs yet." />
<LinearLayout <LinearLayout
android:id="@+id/log_rows"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" /> android:orientation="vertical"
</LinearLayout> android:padding="@dimen/page_padding">
</ScrollView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout> <TextView
android:id="@+id/empty_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="No logs yet." />
<LinearLayout
android:id="@+id/log_rows"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</LinearLayout>
</ScrollView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/scroll_to_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:contentDescription="Scroll to top"
android:visibility="gone"
android:src="@android:drawable/arrow_up_float" />
</FrameLayout>