web-dev-qa-db-ja.com

Androidテキストが追加されたときのscrollviewの自動スクロール

Androidアプリにテキストビューを含むスクロールビューがあります。このテキストビューには、設定された間隔で連続してテキストが追加されます。スクロールは機能し、テキストは問題なく追加されますが、テキストが追加されると、スクロールビューが自動スクロールダウンします。新しいテキストが下部に追加されると、自動的に下にスクロールして一致し、古いテキストは上部から見えなくなります。テキストをスクロールビューの一番下に移動して、古いテキストを上に押しますが、一度に1つずつ。

23
AndroidHopeful
<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>
18
papaiatis

私は重力で解決策を試しましたが、下にスクロールすると、実際のテキストの下に多くの空白スペースができました。

つまり、それは別の方法です。 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
        }

    }) }

実際、私は今、アプリケーションがテキストを変更するたびにスクロールするだけでなく、スクロールすることに気づきました。しかし、それは私にとってはうまくいきます。

9
Kamarado

テキストが追加されたら、ScrollView全体を下にスクロールするだけです。

textView.append(text);
scroll.fullScroll(View.FOCUS_DOWN)
2
dilix

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かもしれません。

0
kristianlm
textView.append(text);
scroll.fullScroll(View.FOCUS_DOWN)

これにより問題が発生し、Android:layout_gravity="bottom"により、最上部までスクロールしません。

0
sekhar