Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ScrollView,在可见之前滚动_Android - Fatal编程技术网

Android ScrollView,在可见之前滚动

Android ScrollView,在可见之前滚动,android,Android,在屏幕显示之前,如何将scrollview的滚动设置为x像素 在ScrollView中,我有一些视图,我知道它将填充屏幕。我是否可以滚动到第二个视图,以便在活动启动时第一个视图不可见 现在我有这样的东西,但我认为它并不完美,有时,我看到第一个视图,然后滚动到第二个视图 @Override public void onGlobalLayout() { if (mHorizontalScrollView.getChildCount() > 0 && mHorizonta

在屏幕显示之前,如何将scrollview的滚动设置为x像素

在ScrollView中,我有一些视图,我知道它将填充屏幕。我是否可以滚动到第二个视图,以便在活动启动时第一个视图不可见

现在我有这样的东西,但我认为它并不完美,有时,我看到第一个视图,然后滚动到第二个视图

@Override
public void onGlobalLayout() {
    if (mHorizontalScrollView.getChildCount() > 0 && mHorizontalScrollView.getChildAt(0).getWidth() > mScreenWidth) {
            hsv.scrollTo(100, 0);
    }
}
编辑

第二次尝试是使用而不是 在
OnPreDrawListener
中,我们可以看到
此时,树中的所有视图都已测量并给出了一个框架。客户端可以使用它来调整滚动边界,甚至在绘图之前请求新布局。
因此,基本上在这一点上,我们应该调整滚动。所以我创造了:

@Override
public boolean onPreDraw() {
    if (hsv.getChildCount() > 0 && hsv.getChildAt(0).getWidth() > mScreenWidth) {
        hsv.scrollTo(100, 0);
        return false;
    }
    return true;
}
但现在它再也不适合我了。

使用:

scrollTo (int x, int y)

It sets the scrolled position of your view. This will cause a call to onScrollChanged
有关更多详细信息:请参见此


正确的方法是在视图完成测量和布局过程后调用ScrollView上的scrollTo(),否则ScrollView中内容的宽度将为0,因此scrollTo()将不会滚动到正确的位置。通常在调用构造函数之后以及视图添加到其父视图之后


有关android如何绘制视图的更多信息,请参见。

在onCreate方法中尝试View.post(Runnable)。

我将
OnGlobalYout
与下面的代码结合起来。使用这种方法虽然不是很好,但仍然非常有效。当我得到onGlobalLayout事件时,我会检查布局是否完成,然后如果可以,我会使用下面的方法

// hsv - horizontal scroll view
private void forceShowColumn(final int column) {
    int scrollTo = childViewWidth * column;
    if (scrollTo == hsv.getScrollX()) {
        return;
    }
    hsv.scrollTo(scrollTo, 0);

    hsv.postDelayed(new Runnable() {

        @Override
        public void run() {
            forceShowColumn(column);
        }
    }, 10);
}

MrJre给出了最优雅的解决方案:“在scrollview中重写onLayout(),然后在super.onLayout()之后再执行它。”

此处的示例代码:


我通过在控制我的ScrollView的片段中实现View.OnLayoutChangeListener解决了这个问题

public class YourFragment extends Fragment implements View.OnLayoutChangeListener{


发布代码以避免负面投票。我不知道为什么我会获得负面投票,但我已经准备添加一些代码,以显示我的想法这是一个糟糕的解决方案;)这是不确定的,而且是基于运气。我很想知道你为什么对post()作出不确定的判断。另外,您最终还是使用了postDelayed()。正如您看到我的代码一样,我检查是否设置了scrollview子宽度。那么有没有其他方法来检查我是否可以滚动?我还使用了“也许我应该使用”?另一种可能是覆盖scrollview中的onLayout(),并在super之后在那里执行。onLayout()是的,我曾经这样做过,但每次都不起作用,有时屏幕会闪烁。在OnLayout中,我甚至检查了是否设置了大小。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.your_fragment_layout, container, false);

    //set scrollview layout change listener to be handled in this fragment
    sv = (ScrollView) view.findViewById(R.id.your_scroll_view);
    sv.addOnLayoutChangeListener(this);

    return view;
}
public void onLayoutChange (View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom){
    switch (v.getId())
    {
        case R.id.your_scroll_view:
        {
                sv.scrollTo(0, sv.getTop());
        }
    }
}