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