📜  如何在 Android 中检测 ScrollView 的结束?

📅  最后修改于: 2022-05-13 01:55:05.566000             🧑  作者: Mango

如何在 Android 中检测 ScrollView 的结束?

在 Android 中,ScrollView 是一个允许用户上下滚动以访问其中声明的元素的视图。 ScrollView 最常用于显示包含大量文本的 TextView,这些文本不适合单个屏幕实例。用户可以向下和向上滚动以从 TextView 中阅读完整的文本。 ScrollViews 也用于应用程序要求用户在同意之前阅读每个条款和条件的表单。除非到达底部,否则用户无法继续,因为按钮被禁用。一个例子如下所示。

Android中的滚动视图

因此,在本文中,我们将向您展示如何创建一个函数来检测用户是否已到达 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 消息,指示已到达底部。达到顶峰时也是如此。