2013-05-03 105 views
0

我有一个基本的Android应用程序设置与滚动视图和文本动态添加到它。 当我添加文本时(已经发生),我希望它滚动到底部,但如果你已经在底部,我只希望它滚动到底部,所以如果你正在阅读的东西不只是滚动。 这是我到目前为止。Android ScrollView只滚动到底部,如果你已经有

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); 
      } 
     } 
    }); 
} 

回答

0

这是我在仿真器和我的星系中运行的一个工作示例。 基本上有两个按钮可以将文本添加到底部文本视图,具体取决于您的设备大小,只有其中的第二个可用于查看自动滚动。正在编辑的文本视图使用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; 
} 
    } 

希望这有助于。

+0

这没有奏效:/ – 2013-05-04 12:09:41

+0

我认为您需要在当时进行比较,但为了让您的文本在滚动前在屏幕上呈现,可以在单独的线程中延迟更改滚动位置,否则当你调用'scroller.fullScroll(ScrollView.FOCUS_DOWN);'它会滚动到当前尚未使用文本更新的屏幕底部。如果到那时你还没有管理它,将会在接下来的几天尝试并发布一些示例代码。 – Matt 2013-05-05 16:12:11

+0

但是我想要它做的是,如果你的滚动位置在底部,当添加新文本时它会滚动到底部,如果你有点读取smoething它只是附加它,并让你继续读你是什么。但从看到的东西来看似乎不可能。 – 2013-05-06 06:01:04

1

我发现迄今最好的解决办法是使用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); 
     } 
    }); 
} 
0

不要问我为什么,但设置你的TextView“它的重力到bottom它确实是你想要的。

相关问题