Android:隐藏屏幕顶部边缘的 View

标签 android android-layout scrollview

是否可以隐藏屏幕顶部边缘的 View ,并且只有在用户向上滚动时它才会出现?

我第一次尝试使用 ScrollView ,但似乎 scrollTo() 不起作用,除非我使用 postDelayed(它甚至不能与 Post() 一起使用)。我尝试将它添加到 scrollview 的 View 树观察器 onPreDraw() 事件中,但它仍然不起作用,除非我延迟它,所以当 Activity 首次启动时会出现一个丑陋的故障。

第二个问题是,如果屏幕键盘被最小化,则 View 不再需要滚动,因此使用滚动偏移隐藏内容不再有效。我考虑过在代码中操纵高度,但这看起来很老套。

有没有比使用 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() 代码一样工作,但在启动 Activity 时仍然存在故障,因为 Activity 首先在滚动条为 0 时绘制。

最佳答案

我还没有试过这个,但你可能想创建一个自定义的 ScrollView 并覆盖 onMeasure:

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

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

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

关于Android:隐藏屏幕顶部边缘的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5411968/

相关文章:

android - 如何将ScrollView滚动到文本中的某个位置

ios - 在 ScrollView 中显示来自 xib 的 View

Android Removing View 不结束它的动画

android - 底部栏不显示 ScrollView 内容

iphone - iPad - 显示垂直分页

android - LinearLayout 中的 ImageView

android - 为什么 view.bringToFront() 不起作用?

java - Android Studio 请求位置权限弹窗

java - 在 Eclipse 上运行 logcat

Xamarin.Forms 中的 Android CoordinatorLayout