今天发现一个问题,关于ScrollView内的子控件如LinearLayout在使用LinearLayout.scrollto(x,y)方法是会无效的问题。
打从一开始当scrollView无滑动,或者内容没有超出一屏幕高度时,子控件LinearLayout.scrollto(x,y)方法是正常且可行的。
binding.etPassword.setOnFocusChangeListener((v, hasFocus) -> {
if (hasFocus) {
viewModel.passwordHasFocus.set(true);
binding.ll.scrollTo(0, unDisplayViewSize(binding.clPasswordIcon));
} else {
viewModel.passwordHasFocus.set(false);
binding.ll.scrollTo(0, 0);
}
});
但一旦内容超出一屏幕高度后,LinearLayout.scrollto(x,y)的方法就不生效了。
通过多次尝试和查找资料发现。
可以将目标子控件的先通过ScrollView.smoothScrollTo()到子控件相应位置后,再使用子控件LinearLayout.scrollto(x,y)方法就会生效了。
代码如下:
binding.etPassword.setOnFocusChangeListener((v, hasFocus) -> {
if (hasFocus) {
binding.scrollView.smoothScrollTo(0, binding.etPassword.getBottom());
viewModel.passwordHasFocus.set(true);
binding.ll.scrollTo(0, unDisplayViewSize(binding.clPasswordIcon));
} else {
viewModel.passwordHasFocus.set(false);
binding.ll.scrollTo(0, 0);
}
});