我在Android应用中有一个包含textview的scrollview。此文本视图将按设定的间隔连续添加文本。滚动工作和文本添加正常,但我想做的是在添加文本时使scrollview自动滚动。当新文本附加在底部时,它会自动向下滚动以匹配,并且旧文本在顶部被推出视线之外。更好的是将文本添加到滚动视图的底部并让它向上推旧文本,但一次只能做一件事。
答案 0 :(得分:18)
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fillViewport="true"
>
<TextView
android:id="@+id/statusText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
</ScrollView>
答案 1 :(得分:9)
我尝试了重力解决方案,但滚动到底部时,实际文本下的结果很多。
这是另一种方式。您可以将TextView放在ScrollView中:
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:fillViewport="true" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
定义addTextChangedListener
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
//some code here
ScrollView scrollView1 = (ScrollView) findViewById(R.id.scrollView1);
TextView textView1 = (TextView) findViewById(R.id.textView1);
textView1.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
scrollView1.fullScroll(ScrollView.FOCUS_DOWN);
// you can add a toast or whatever you want here
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
//override stub
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
//override stub
}
}) }
实际上我现在注意到应用程序会在每次更改文本时滚动,而不仅仅是添加。但它对我来说效果很好。
答案 2 :(得分:2)
添加文字后,您只需将整个ScrollView
滚动到底部即可。
textView.append(text);
scroll.fullScroll(View.FOCUS_DOWN)
答案 3 :(得分:0)
textView.append(text);
scroll.fullScroll(View.FOCUS_DOWN)
这会产生问题,由于android:layout_gravity="bottom"
答案 4 :(得分:0)
如果您正在寻找一种更通用的自动滚动到ScrollView底部的方式,则可以尝试以下代码段。它的优点是您无需发布Runnable即可确保您位于UI线程中。缺点是我不确定这可能会破坏什么。
public class AutoScroller extends ScrollView {
public boolean autoscroll = true;
public AutoScroller(Context context) {super(context);}
public AutoScroller(Context context, AttributeSet attrs) {super(context,attrs);}
public AutoScroller(Context context, AttributeSet attrs, int defStyleAttr){super(context, attrs, defStyleAttr);}
public AutoScroller(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if(autoscroll) {
scrollTo(getScrollX(), getChildAt(getChildCount()-1).getBottom() - getHeight());
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
另一个优先选择的候选者可能是onLayout
。