我有HorizontalScrollView
,其中包含RelativeLayout
。这个布局在XML中是空的,并且是从onCreate中的java填充的。
我希望这个滚动视图最初位于RelativeLayout
中间的某个位置,这比屏幕大。
我尝试了mHorizScrollView.scrollTo(offsetX, 0);
这不起作用。
我不知道这有什么问题。
我可以发布代码,但它并不真正相关。重要的是,所有内容都是以编程方式完成的(必须:s),并且必须以编程方式设置HorizontalScrollView
的初始位置。
感谢阅读。如果您需要更多详细信息或者不够清楚,请告诉我。
答案 0 :(得分:26)
我发现,如果您extend
HorizontalScrollView
并覆盖onLayout
,则可以在超级调用onLayout
后干净地滚动:
MyScrollView extends HorizontalScrollView {
protected void onLayout (boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
this.scrollTo(wherever, 0);
}
}
修改强> 要滚动到开始或结束,您可以使用:
this.fullScroll(HorizontalScrollView.FOCUS_RIGHT/FOCUS_LEFT);
而不是
this.scrollTo(wherever, 0);
答案 1 :(得分:24)
public void autoSmoothScroll() {
final HorizontalScrollView hsv = (HorizontalScrollView) view.findViewById(R.id.horiscroll);
hsv.postDelayed(new Runnable() {
@Override
public void run() {
//hsv.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
hsv.smoothScrollBy(500, 0);
}
},100);
}
答案 2 :(得分:16)
要测试它是否是计时问题(我认为是这样),而不是在onStart中调用scrollTo(),而是使用调用scrollTo的Runnable调用postDelayed(),延迟时间为30左右。
答案 3 :(得分:9)
更好的方法是使用ViewTreeObserver
来观察布局。
View interestedInView;
onCreate(){
//Code
//Observe for a layout change
ViewTreeObserver viewTreeObserver = interestedInView.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//REMOVE THE VIEWTREE OBSERVER
//interestedInView is ready for size and position queries because it has been laid out
}
});
}
}
答案 4 :(得分:1)
问题是视图还没有大小。 Clean的方法是实现ScrollView的onSizeChanged,以便向活动中的Handler发送消息,以便通知活动视图具有大小并且可以滚动。
答案 5 :(得分:1)
使用view.post并在run方法中写入scrollTo(x,y)。这是根据android API文档在post方法中使视图无效的方法。
答案 6 :(得分:0)
scrollTo函数应该可以工作。什么是HSV的layout_width,以及它内部的视图?
答案 7 :(得分:0)
onSizeChanged函数应该可以工作。您无法理解的是onSizeChanged应该向您的活动的Handler发送消息而不是任何回调函数,因为处理程序将在UI线程中执行代码。你不能在它之外做UI操作。看看处理程序。
答案 8 :(得分:0)
使用 Kotlin 扩展功能。
inline fun <T : View> T.afterMeasured(crossinline f: T.() -> Unit) {
viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
if (measuredWidth > 0 && measuredHeight > 0) {
viewTreeObserver.removeOnGlobalLayoutListener(this)
f()
}
}
})
}
用法:
mHorizontalScrollView.afterMeasured {
var scrollTo = 0
val count = (layout.svList.getChildAt(0) as LinearLayout)
.childCount
if(index < count){
val child = (layout.svList.getChildAt(0) as LinearLayout)
.getChildAt(index)
scrollTo = child.width
}
Log.d(TAG, "scrollToComment: $scrollTo")
mHorizontalScrollView.scrollTo(scrollTo, 0)
}