我有一个包含LinearLayout的HorizontalScrollView。屏幕上有一个按钮,会在运行时向LinearLayout添加新视图,并且当添加新视图时,我希望滚动视图滚动到列表的末端。
我已经接近成功了——除了它总是滚动到倒数第二个视图。似乎在计算新视图的包含之前就已经开始滚动了。
在我的应用程序中,我使用了自定义的View对象,但我制作了一个使用ImageView并具有相同症状的小测试应用程序。我尝试过各种方法,例如在布局和ScrollView上请求requestLayout(),我尝试了scrollTo(Integer.MAX_VALUE),但它滚动到了虚无之地:) 我是否违反了UI线程问题或其他问题?
- Rick
======
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b = (Button) findViewById(R.id.addButton);
b.setOnClickListener(new AddListener());
add();
}
private void add() {
LinearLayout l = (LinearLayout) findViewById(R.id.list);
HorizontalScrollView s =
(HorizontalScrollView) findViewById(R.id.scroller);
ImageView i = new ImageView(getApplicationContext());
i.setImageResource(android.R.drawable.btn_star_big_on);
l.addView(i);
s.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
}
private class AddListener implements View.OnClickListener {
@Override
public void onClick(View v) {
add();
}
}
}
布局XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<HorizontalScrollView
android:id="@+id/scroller"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbarSize="50px">
<LinearLayout
android:id="@+id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="4px"/>
</HorizontalScrollView>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center">
<Button
android:id="@+id/addButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingLeft="80px"
android:paddingRight="80px"
android:paddingTop="40px"
android:paddingBottom="40px"
android:text="Add"/>
</LinearLayout>
</LinearLayout>
View
类中的一个方法。你可能需要执行s.postDelayed(...)
。或者,创建一个Handler
并使用它的postDelayed()
方法。 - Ted HopppostDelayed()
,可以尝试使用new Handler().postDelayed()
。 - Pratik ButaniHandler
分配为一个字段并使用它,而不是每次都动态创建一个。然而,由于我们已经有了视图引用s
,最好只使用s.postDelayed(...)
,这样可以很好地避免需要自己创建Handler
的需求。 - Ted Hopp