Я пытался установить начальную позицию представления прокрутки, но не нашел способа. У кого-нибудь есть какие-либо идеи? Также у меня есть фрагмент GoogleMaps как дочерний элемент представления прокрутки.
Спасибо,
Райан
Я пытался установить начальную позицию представления прокрутки, но не нашел способа. У кого-нибудь есть какие-либо идеи? Также у меня есть фрагмент GoogleMaps как дочерний элемент представления прокрутки.
Спасибо,
Райан
Да, это возможно:
ScrollView.scrollTo(int x, int y);
ScrollView.smoothScrollTo(int x, int y);
ScrollView.smoothScrollBy(int x, int y);
можно использовать для этого. Параметры x и y — это координаты для прокрутки по горизонтальной и вертикальной осям.
Пример в коде:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
ScrollView sv = (ScrollView) findViewById(R.id.scrollView);
sv.scrollTo(0, 100);
}
В этом примере после запуска Activity
ваш ScrollView
будет прокручен на 100 пикселей вниз.
Вы также можете попытаться задержать процесс прокрутки:
final ScrollView sv = (ScrollView) findViewById(R.id.scrollView);
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
sv.scrollTo(0, 100);
}
}, 250); // 250 ms delay
Принятый ответ не работает для меня. Нет прямого способа установить начальную позицию прокрутки.
Однако вы можете установить начальное положение перед рисованием прокрутки, например:
rootView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
scrollView.getViewTreeObserver().removeOnPreDrawListener(this);
scrollView.setScrollY(100);
return false;
}
});
Вы также можете использовать scrollView.setScrollY(100)
внутри Handler
, но это будет рывками при прокрутке.
onWindowFocusChanged
более стабильно. См. stackoverflow.com/questions/10507976/< /а>
- person Xavier.S; 31.05.2017
Ни один из ответов не сработал для меня. Мой ScrollView
является частью окружающего LinearLayout
. Я вставил корректировку ScrollView
в метод onDraw()
этого LinearLayout
вот так:
@Override
protected void onDraw(Canvas canvas){
if(scrollAdjustTries > 2){
return;
}
scrollAdjustTries++;
mScrollView.scrollTo(0, mModel.scrollLine());
}
Очень некрасиво, но работает.
После нескольких часов поиска в Интернете
это сработало для меня:
ScrollView.post(new Runnable() {
@Override
public void run() {
//setting position here :
ScrollView.scrollTo(X, Y);
}
});
Проблема в том, что ScrollView не знает своего размера до того, как он будет выложен. Решение состоит в том, чтобы сохранить положение прокрутки до тех пор, пока не будет вызван onLayout, а затем установить положение прокрутки.
Вот пример (котлин):
class MyScrollView constructor(context: Context, attrs: AttributeSet) : ScrollView(context, attrs) {
private var hasStartPositionBeenSet = false
var startPosition = 0
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
super.onLayout(changed, l, t, r, b)
if(!hasStartPositionBeenSet) {
scrollTo(0, startPosition)
hasStartPositionBeenSet = true
}
}
}
class MyActivity: Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
/* ... */
findViewById<MyScrollView>(R.id.scrollView).startPosition = scrollPosition
}
}