Android:隐藏屏幕顶部边缘的视图

时间:2011-03-23 21:40:40

标签: android android-layout scrollview

是否可以隐藏屏幕顶部边缘的视图,并且只有在用户向上滚动时才会显示该视图?

我的第一次尝试使用了scrollview,但似乎scrollTo()不起作用,除非我使用postDelayed(它甚至不能用于Post())。我尝试将它添加到scrollview的视图树观察器onPreDraw()事件中,除非我延迟它,否则它仍然无效,因此在首次启动活动时会出现一个丑陋的故障。

第二个问题是,如果屏幕键盘最小化,则视图不再需要滚动,因此使用滚动偏移不再起作用隐藏事物。我想过在代码中操纵高度,但这看起来很神圣。

有没有比使用scrollview更好的方法呢?或者,有没有人有关于放置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;
        }
    });

我也尝试使用如下所述的自定义scrollview,但这并没有解决图形故障的问题:

@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 个答案:

答案 0 :(得分:1)

我没试过,但您可能想要创建自定义ScrollView并覆盖onMeasure

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

这似乎是scrollTo最有效的一点。

修改 - 我找到this answer,显然对提问者有用。这是你试过的方法吗?