Androidアプリにテキストビューを含むスクロールビューがあります。このテキストビューには、設定された間隔で連続してテキストが追加されます。スクロールは機能し、テキストは問題なく追加されますが、テキストが追加されると、スクロールビューが自動スクロールダウンします。新しいテキストが下部に追加されると、自動的に下にスクロールして一致し、古いテキストは上部から見えなくなります。テキストをスクロールビューの一番下に移動して、古いテキストを上に押しますが、一度に1つずつ。
<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>
私は重力で解決策を試しましたが、下にスクロールすると、実際のテキストの下に多くの空白スペースができました。
つまり、それは別の方法です。 ScrollView内にTextViewを配置できます。
<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
}
}) }
実際、私は今、アプリケーションがテキストを変更するたびにスクロールするだけでなく、スクロールすることに気づきました。しかし、それは私にとってはうまくいきます。
テキストが追加されたら、ScrollView
全体を下にスクロールするだけです。
textView.append(text);
scroll.fullScroll(View.FOCUS_DOWN)
ScrollViewの下部まで自動スクロールするより一般的な方法を探している場合は、以下のスニペットを試すことができます。 UIスレッドにいることを確認するためにRunnableをポストする必要がないという利点があります。これには何が壊れるかわからないという欠点があります。
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
かもしれません。
textView.append(text);
scroll.fullScroll(View.FOCUS_DOWN)
これにより問題が発生し、Android:layout_gravity="bottom"
により、最上部までスクロールしません。