0

スクロールビューとテキストが動的に追加された基本的なAndroidアプリをセットアップしています。テキストが追加されたときに一番下までスクロールしたいのですが(これはすでに発生しています)、すでに一番下にいる場合にのみ一番下までスクロールしたいので、何かを読んでいる場合はスクロールしません。これが私がこれまでに持っているものです。

private void AddText(final String msg){
    this.runOnUiThread(new Runnable() {
        public void run() {
            TextView log = (TextView) findViewById(R.id.chatlog);
            if(log.getText().equals("Loading...")){
                log.setText(msg);
            }else{
                ScrollView scroller = (ScrollView) findViewById(R.id.scroll_container);
                //set current scroll position
                int scroll_pos = scroller.getScrollY();
                //scroll to bottom
                scroller.fullScroll(ScrollView.FOCUS_DOWN);
                //set bottom position
                int scroll_bot = scroller.getScrollY();
                //add the text
                log.append("\r\n" + msg);
                //if you weren't at the bottom
                //scroll back to where you were.
                //This isn't working, scroll bot is the same
                //as scroll pos.
                if(scroll_pos != scroll_bot){
                    scroller.scrollTo(0, scroll_pos);
                }
                //System.out.println("Pos: " + scroll_pos);
                //System.out.println("Bot: " + scroll_bot);
            }
        }
    });
}
4

3 に答える 3

2

これまでに見つけた最善の解決策は、テキストの変更後に呼び出される runnable で scrollView.post() メソッドを使用することです。

final ScrollView scrollView = (ScrollView) findViewById(R.id.consoleTab);
TextView textView = (TextView) findViewById(R.id.consoleView);
boolean autoScroll = (textView.getBottom() - (scrollView.getHeight() + scrollView.getScrollY())) <= 0;
textView.setText(state.getConsole().getText());

if (autoScroll) {
   scrollView.post(new Runnable() {
      public void run() {
         scrollView.fullScroll(ScrollView.FOCUS_DOWN);
      }
   });
}
于 2014-01-11T09:23:43.373 に答える
0

これは、エミュレーターと Galaxy s で実行した実際の例です。基本的に、下部のテキスト ビューにテキストを追加するためのボタンが 2 つあります。デバイスのサイズによっては、自動スクロールを表示するために使用できるのは 2 番目のボタンだけです。編集中のテキストビューは、ontextchangedlistener を使用して、テキストが変更される前にスクロール位置を確認し、テキストが変更された後、必要に応じて (追加のテキストで画面を更新できるように) 遅延自動スクロールを呼び出します。

レイアウト xml は次のとおりです。

  <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:id="@+id/scrollmain">
<RelativeLayout
    android:id="@+id/mainRelative"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >  
    <TextView
        android:id="@+id/titleText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Welcome to the scrolling test application!" />
    <Button 
        android:id="@+id/firstTextAddButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/titleText"
        android:text="Click me to add text to the textview below without scrolling"/>
    <Button 
        android:id="@+id/secondTextAddButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/firstTextAddButton"
        android:layout_marginTop="380dp"
        android:text="Click me to add text to the textview below and scroll (if you are currently scrolled all the way to the bottom)"/>
    <TextView
        android:id="@+id/textToEdit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/secondTextAddButton"
        android:textSize="18sp"
        android:text="Some text to get us started."/>
        />
</RelativeLayout>
  </ScrollView>

アクティビティのコードは次のとおりです。

  package code.example.scrollingontextchange;

  import android.os.Bundle;
  import android.os.Handler;
  import android.app.Activity;
  import android.text.Editable;
  import android.text.TextWatcher;
  import android.view.Menu;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.RelativeLayout;
  import android.widget.ScrollView;
  import android.widget.TextView;

  public class MainActivity extends Activity {

private int scroll_pos;
private int maxScrollPosition;  

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView tv = (TextView)findViewById(R.id.textToEdit);
    tv.addTextChangedListener(new TextWatcher(){
        @Override
        public void afterTextChanged(Editable s) {              
            if(scroll_pos == maxScrollPosition)
            {
                Handler h = new android.os.Handler()
                {
                    @Override             
                    public void handleMessage(android.os.Message msg) 
                    {                 
                        switch(msg.what)
                        {
                            case 0 :
                            try {
                                Thread.sleep(500);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                                ScrollView scrll = (ScrollView)findViewById(R.id.scrollmain);
                                scrll.fullScroll(ScrollView.FOCUS_DOWN);
                                break;                              
                            default :
                                break;
                        }
                    }
                };
                h.sendEmptyMessage(0);                  
            }
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            ScrollView scrll = (ScrollView)findViewById(R.id.scrollmain);
            RelativeLayout rl = (RelativeLayout)findViewById(R.id.mainRelative);

            scroll_pos = scrll.getScrollY();

            maxScrollPosition = rl.getHeight() - scrll.getHeight();             
        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

        }           
    });

    OnClickListener addTextOnClick = new OnClickListener() {
        @Override
        public void onClick(View v) {
            TextView tv = (TextView)findViewById(R.id.textToEdit);
            tv.setText(tv.getText() + "\nA long time ago, in a galaxy s far far away............");
        }           
    };

    Button b = (Button)findViewById(R.id.firstTextAddButton);
    b.setOnClickListener(addTextOnClick);
    Button b2 = (Button)findViewById(R.id.secondTextAddButton);
    b2.setOnClickListener(addTextOnClick);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
  }

お役に立てれば。

于 2013-05-03T13:41:14.290 に答える