Android scrollto не работает в onResume

Я хотел бы прокрутить экран до определенной позиции, когда отображается экран, поэтому я сделал этот код в функции Onresume моего фрагмента

  scrollView.post(new Runnable() {
        @Override public void run () {
            scrollView.scrollTo(0, -200);
            Log.d(TAG, "x: " + scrollView.getScrollX() + " " + "y: " + scrollView.getScrollY());
        }
    }

    );

но прокрутка не прокручивается

Ответ 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   
        }
    });
}