ScrollView 的子控件 使用scroll无效的问题

今天发现一个问题,关于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);
            }
        });

你可能感兴趣的:(ScrollView 的子控件 使用scroll无效的问题)