Ответ 1
Я столкнулся с той же проблемой при прокручивании фрагмента на предыдущую позицию при возврате к ней. В onResume() нет прокрутки. Я подозреваю, что когда вы отправляете runnable (как вы упоминаете в своем вопросе), нет никакой гарантии, будет ли это работать.
Я нашел 2 решения, надеюсь, что это поможет:
1) Более общий подход, однако он не работает для уровня API < 11:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// inflate your main view
mView = inflater.inflate(R.layout.your_fragment_id, container, false);
// find your scroll view
mScrollContainer = (ScrollView) mView.findViewById(R.id.scroll_container);
// add OnLayoutChangeListener
mView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
// get your X and Y to scroll to
...
mScrollContainer.scrollTo(x,y);
}
}
});
}
Вы должны получить X и Y из своего собственного источника (скажем, собственный комплект), поскольку в большинстве случаев - когда активность не сохраняет его состояние - вы просто не можете использовать фрагмент, сохраненныйInstanceState (см. здесь)
2) Более конкретный, но иногда более полезный метод - установить OnFocusChangeListener для элемента, который получает фокус после отображения фрагмента:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
mListView.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// do your scrolling here
}
});
}