如何在 Android 中检测 ScrollView 的结束?
在 Android 中,ScrollView 是一个允许用户上下滚动以访问其中声明的元素的视图。 ScrollView 最常用于显示包含大量文本的 TextView,这些文本不适合单个屏幕实例。用户可以向下和向上滚动以从 TextView 中阅读完整的文本。 ScrollViews 也用于应用程序要求用户在同意之前阅读每个条款和条件的表单。除非到达底部,否则用户无法继续,因为按钮被禁用。一个例子如下所示。
因此,在本文中,我们将向您展示如何创建一个函数来检测用户是否已到达 Android 中 ScrollView 的末尾。 IDE 准备就绪后,请按照以下步骤操作。
分步实施
第 1 步:在 Android Studio 中创建一个新项目
要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。我们在 Kotlin 中演示了该应用程序,因此请确保在创建新项目时选择Kotlin作为主要语言。
第 2 步:添加字符串
导航到app > res > values > 字符串.xml并添加示例字符串,如下所示。
XML
GFG | ScrollViewEnd
"Text Goes Here"
XML
Kotlin
package org.geeksforgeeks.scrollviewend
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.view.ViewTreeObserver
import android.widget.ScrollView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
// Extend Touch Listener and Scroll Listener
class MainActivity : AppCompatActivity(), View.OnTouchListener, ViewTreeObserver.OnScrollChangedListener {
// Declaring ScrollView from the layout file
private lateinit var mScrollView: ScrollView
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Initializing the ScrollView
mScrollView = findViewById(R.id.scroll_view_1)
// Invoking touch listener to detect movement of ScrollView
mScrollView.setOnTouchListener(this)
mScrollView.viewTreeObserver.addOnScrollChangedListener(this)
}
// We want to detect scroll and not touch,
// so returning false in this member function
@SuppressLint("ClickableViewAccessibility")
override fun onTouch(p0: View?, p1: MotionEvent?): Boolean {
return false
}
// Member function to detect Scroll,
// when detected 0, it means bottom is reached
override fun onScrollChanged() {
val view = mScrollView.getChildAt(mScrollView.childCount - 1)
val topDetector = mScrollView.scrollY
val bottomDetector: Int = view.bottom - (mScrollView.height + mScrollView.scrollY)
if (bottomDetector == 0) {
Toast.makeText(baseContext, "Scroll View bottom reached", Toast.LENGTH_SHORT).show()
}
if (topDetector <= 0) {
Toast.makeText(baseContext, "Scroll View top reached", Toast.LENGTH_SHORT).show()
}
}
}
第 3 步:使用 activity_main.xml 文件
导航到app > res > layout > activity_main.xml并将以下代码添加到该文件。下面是activity_main.xml文件的代码。在 ScrollView 中添加一个 TextView,如下所示。将 TextView 的文本设置为我们在上述代码中创建的字符串。
XML
第 4 步:使用 MainActivity.kt 文件
转到MainActivity.kt文件并参考以下代码。下面是MainActivity.kt文件的代码。代码中添加了注释以更详细地理解代码。
科特林
package org.geeksforgeeks.scrollviewend
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.view.ViewTreeObserver
import android.widget.ScrollView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
// Extend Touch Listener and Scroll Listener
class MainActivity : AppCompatActivity(), View.OnTouchListener, ViewTreeObserver.OnScrollChangedListener {
// Declaring ScrollView from the layout file
private lateinit var mScrollView: ScrollView
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Initializing the ScrollView
mScrollView = findViewById(R.id.scroll_view_1)
// Invoking touch listener to detect movement of ScrollView
mScrollView.setOnTouchListener(this)
mScrollView.viewTreeObserver.addOnScrollChangedListener(this)
}
// We want to detect scroll and not touch,
// so returning false in this member function
@SuppressLint("ClickableViewAccessibility")
override fun onTouch(p0: View?, p1: MotionEvent?): Boolean {
return false
}
// Member function to detect Scroll,
// when detected 0, it means bottom is reached
override fun onScrollChanged() {
val view = mScrollView.getChildAt(mScrollView.childCount - 1)
val topDetector = mScrollView.scrollY
val bottomDetector: Int = view.bottom - (mScrollView.height + mScrollView.scrollY)
if (bottomDetector == 0) {
Toast.makeText(baseContext, "Scroll View bottom reached", Toast.LENGTH_SHORT).show()
}
if (topDetector <= 0) {
Toast.makeText(baseContext, "Scroll View top reached", Toast.LENGTH_SHORT).show()
}
}
}
输出:
您可以看到,当我们向下滚动到底部时,会出现一条 Toast 消息,指示已到达底部。达到顶峰时也是如此。