如何检查ScrollView是否实际显示?

问题描述 投票:0回答:3

我有这个会改变的动态文本。仅当用户阅读所有文本时,我才需要启用此布局的按钮。 (滚动到底部)。这是与我已经实现的方法一起工作的。 scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {

@Override
public void onScrollChange(View view, int i, int i1, int i2, int i3) {
                if (isTextViewScrolledToBottom(scrollView, mTextViewNotPDF)) {
                    mAgreeButton.setEnabled(true);
                    mAgreeButton.setBackground(getResources().getDrawable(R.drawable.button_bg_black_rounded));
                } else {
                    mAgreeButton.setEnabled(false);
                    mAgreeButton.setBackground(getResources().getDrawable(R.drawable.button_bg_grey_rounded));
                }
            }
        });


private boolean isTextViewScrolledToBottom(ScrollView scrollView, TextView mTextViewNotPDF) {
        int scrollViewHeight = scrollView.getHeight();
        int textViewHeight = mTextViewNotPDF.getHeight();
        int scrollY = scrollView.getScrollY();
        return (textViewHeight) <= (scrollY + scrollViewHeight);
    }
    
    

    

但是当文本长度不足以启用滚动视图时,将不会调用此方法(onScrollChange)并且按钮将被禁用。

到目前为止我已经测试过这些但没有成功。

Boolean isAct =  scrollView.isEnabled(); // will be true no matter it's showing or not.  
Boolean isAct1 = scrollView.isFocusable(); // will be true no matter it's showing or not.  
java android android-scrollview
3个回答
0
投票

你尝试过吗

scrollView.canScrollVertically(1)

(检查向下滚动的正值)?

您可以在创建视图时执行此操作(在

onScrollChange
之外,因为它可能不会被调用)。 但请注意,视图可能需要先绘制和测量:

scrollView.post(() -> {
    boolean canScroll = scrollView.canScrollVertically(1)
});


如果这不起作用,检查textViewHeight是否小于scrollView的高度怎么样?再次确保视图已经绘制和测量。


0
投票

您可以执行以下操作,而不是使用 RecyclerView 并手动启用按钮:

将 Recyclerview 嵌套在父布局(例如 ConstraintLayout)中,并使 Button 位于 RecyclerView 下方。然后,您可以将其与(垂直)ScrollView 嵌套,并使用

android:scrollbars="none"
完全禁用 Bar。然后布局就会像您想要的那样表现。您必须在 RecyclerView 条目中向下滚动,直到 ScrollView 的滚动开始。然后您将向下滚动到 Button,它就会出现。这似乎是解决您问题的好方法,因为您没有“中间”状态。


0
投票

作为 Till 答案的扩展,检查

ScrollView
是否仅在
View
已经绘制之后才可滚动:

ScrollView scrollView = findViewById(R.id.scrollView);
ViewTreeObserver observer = scrollView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        if (scrollView.canScrollVertically(1)) {
            myButton.setEnabled(true);
        }
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.