无法在TextView中自动滚动文本

时间:2014-02-11 20:00:25

标签: android scroll textview autoscroll

当我的文字太长时,我正在尝试自动滚动TextView。我遵循了stackoverflow上发布的每个教程或提示(是的,我引用了一系列类似于此的主题,但没有人修复它。)

所以我有这样的活动布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

....

<TextView
    android:id="@+id/music_name"
    android:layout_width="fill_parent"
    android:layout_height="60dp"
    android:gravity="center"
    android:text="Music Name"
    android:textSize="24sp"
    android:layout_centerHorizontal="true"
    android:singleLine="true"
    android:scrollHorizontally="true"
    android:ellipsize="marquee"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:marqueeRepeatLimit="marquee_forever" />

....

</RelativeLayout>

在OnCreate()中,我这样做:

music_name.setSelected(true);
music_name.setMovementMethod(new ScrollingMovementMethod());

music_name是TextView。

所以即使我的TextView也不会滚动。可能有什么不对?

编辑[新]:我注意到它只是第一次有效。其他时候我更改TextView上的文本它不再起作用。这可能是做什么的?我有线程(Timer)每隔50ms唤醒一次,以更新SeekBar和其他两个TextView,这可能会阻塞一些东西?

4 个答案:

答案 0 :(得分:2)

处理滚动时,

TextView有时会变得棘手。您要在布局中设置的主要属性如下:

android:scrollHorizontally="false"
android:scrollbars="vertical"
android:gravity="bottom"

设置为底部的gravity会在每次附加一行时使滚动条下降到TextView的底部。所以只有在你想要它的时候才使用它。

还需要music_name.setMovementMethod(new ScrollingMovementMethod());语句。

这种方式应该可行。

答案 1 :(得分:0)

您需要使用一些动画,例如res中的anim文件夹中的scroll_textview_animation.xml:

<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:fromXDelta="200"
android:interpolator="@android:anim/linear_interpolator"
android:repeatCount="infinite"
android:repeatMode="restart"
android:toXDelta="-200" />

和onCreate或设置文本后:

music_name.startAnimation((Animation)AnimationUtils.loadAnimation(Context,R.anim.scroll_textview_animation));

或者你可以点击开始动画:

music_name.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            music_name.startAnimation((Animation)AnimationUtils.loadAnimation(Context,R.anim.scroll_textview_animation));
        }
    });

答案 2 :(得分:0)

<TextView
    android:id="@+id/mytext"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="very long text to srollll abcdefghijklmnopqrstdaghlfj'ogjpsroshsrfjhrdjdjkdjdkjdk" 
    android:singleLine="true" 
    android:marqueeRepeatLimit="marquee_forever" 
    android:ellipsize="marquee"
    android:focusable="true" 
    android:focusableInTouchMode="true"/>

答案 3 :(得分:0)

<ScrollView
    android:id="@+id/scrollView1"
    android:layout_width="match_parent"
    android:layout_height="0dp">

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

}) }