我有这个会改变的动态文本。仅当用户阅读所有文本时,我才需要启用此布局的按钮。 (滚动到底部)。这是与我已经实现的方法一起工作的。 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.
你尝试过吗
scrollView.canScrollVertically(1)
(检查向下滚动的正值)?
您可以在创建视图时执行此操作(在
onScrollChange
之外,因为它可能不会被调用)。
但请注意,视图可能需要先绘制和测量:
scrollView.post(() -> {
boolean canScroll = scrollView.canScrollVertically(1)
});
如果这不起作用,检查textViewHeight是否小于scrollView的高度怎么样?再次确保视图已经绘制和测量。
您可以执行以下操作,而不是使用 RecyclerView 并手动启用按钮:
将 Recyclerview 嵌套在父布局(例如 ConstraintLayout)中,并使 Button 位于 RecyclerView 下方。然后,您可以将其与(垂直)ScrollView 嵌套,并使用
android:scrollbars="none"
完全禁用 Bar。然后布局就会像您想要的那样表现。您必须在 RecyclerView 条目中向下滚动,直到 ScrollView 的滚动开始。然后您将向下滚动到 Button,它就会出现。这似乎是解决您问题的好方法,因为您没有“中间”状态。
作为 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);
}
}
});