Android: скрытие вида от верхнего края экрана - PullRequest
1 голос
/ 24 марта 2011

Можно ли скрыть вид за верхним краем экрана, и он будет отображаться только при прокрутке вверх пользователем?

В моей первой попытке использовалось представление прокрутки, но кажется, что scrollTo ()не работает, если я не использовал postDelayed (он даже не работает с Post ()).Я попытался добавить его в событие onPreDraw () наблюдателя дерева представлений прокрутки, и оно все равно не будет работать, пока я не задержу его, поэтому при первом запуске действия возникает неприятный сбой.

Вторая проблема заключается в том, чтоесли экранная клавиатура свернута, представление больше не нуждается в прокрутке, поэтому скрытие объектов с помощью смещения прокрутки больше не работает.Я думал о манипулировании высотой в коде, но это кажется довольно хакерским.

Есть ли лучший способ сделать это, чем с помощью прокрутки?В качестве альтернативы, есть ли у кого-нибудь какие-нибудь советы о том, как лучше всего разместить scrollTo (конец onCreate не работает, как и другие места, которые я пробовал), поэтому мне не нужно использовать postDelayed?Это, по крайней мере, устранит один глюк.

Спасибо!

Это код, который я сейчас использую, который наименее сбой, но я не понимаю, почему он не работаетпока в третий раз не вызывается onPreDraw ().

mScrollView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
    {
        @Override
        public boolean onPreDraw()
        {
            final int fieldYStart = mFieldIWantAtTheTop.getTop();

            if (mFieldIWantAtTheTopYStart != fieldYStart
             || mScrollView.getScrollY() < 10)
            {
                mFieldIWantAtTheTopYStart = fieldYStart;

                mScrollView.post(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        Log.v("Testing", "scrolling!");
                        mScrollView.scrollTo(0, mFieldIWantAtTheTopYStart);
                        Log.v("Testing", "scroll is now=" + mScrollView.getScrollY());
                    }
                });
            }


            return true;
        }
    });

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

@Override
public void onMeasure(int measureWidthSpec, int measureHeightSpec) {
    super.onMeasure(measureWidthSpec, measureHeightSpec);
    Log.v("Testing", "Scrolling");
    post(
            new Runnable()
            {
                public void run()
                {
                    scrollTo(0, 100);
                    Log.v("Testing", "ScrollY = " + getScrollY()); 
                }
            });       
}

Этот код работает так же, как и код onPreDraw (), описанный выше, но при запуске действия все еще наблюдается сбой, поскольку действие сначала отображается с прокруткой на 0.

1 Ответ

1 голос
/ 24 марта 2011

Я не пробовал этого, но вы можете создать собственный ScrollView и переопределить onMeasure:

ScrollView scroll = new ScrollView(this) {
    @Override
    public void onMeasure(int measureWidthSpec, int measureHeightSpec) {
        super.onMeasure(measureWidthSpec, measureHeightSpec);
        scrollTo(...);
    }
};

Кажется, это будет самый ранний момент, когда scrollTo будет действительным.

Редактировать - Я нашел этот ответ , который, очевидно, работал на аскера. Это метод, который вы пробовали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...