scroll - 安卓中TextView Scrollable

  显示原文与译文双语对照的内容

在textview中显示的文本太长,无法放入一个屏幕。 我需要使我的TextView可以滚动。 我要怎么才能做到? 这是代码


 final TextView tv = new TextView(this);

 tv.setBackgroundResource(R.drawable.splash);
 tv.setTypeface(face);
 tv.setTextSize(18);
 tv.setTextColor(R.color.BROWN);

 tv.setGravity(Gravity.CENTER_VERTICAL| Gravity.CENTER_HORIZONTAL);

 tv.setOnTouchListener(new OnTouchListener(){


 public boolean onTouch(View v, MotionEvent e)
 {


 Random r = new Random();
 int i = r.nextInt(101);

 if (e.getAction() == e.ACTION_DOWN)
 {
 tv.setText(tips[i]);
 tv.setBackgroundResource(R.drawable.inner);


 }

 return true;
 }

 });

 setContentView(tv);

时间:

你不需要使用 ScrollView

只需设置


android:maxLines ="AN_INTEGER"

android:scrollbars ="vertical"

布局文件中的TextView的属性。

然后使用:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

在你的代码中。

是的,它会自动滚动而不会出现任何问题。

这是我在XML中实现的方式:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">

 <ScrollView
 android:id="@+id/SCROLLER_ID"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:scrollbars="vertical"
 android:fillViewport="true">

 <TextView
 android:id="@+id/TEXT_STATUS_ID"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:layout_weight="1.0"/>

 </ScrollView>

</LinearLayout>

备注:

1 ) android:fillViewport="true" 结合 android:layout_weight="1.0" 将使textview占用所有可用空间。

2 ) 定义Scrollview时,不要指定 android:layout_height="fill_parent" 否则scrollview无法工作 ! ( 这让我浪费了一个小时的时间) ! FFS )

磅提示:

要在追加文本后以编程方式滚动到底部,请使用以下命令:


mTextStatus = (TextView) findViewById(R.id.TEXT_STATUS_ID);
mScrollView = (ScrollView) findViewById(R.id.SCROLLER_ID);

private void scrollToBottom()
{
 mScrollView.post(new Runnable()
 { 
 public void run()
 { 
 mScrollView.smoothScrollTo(0, mTextStatus.getBottom());
 } 
 });
}

真正需要的是 setMovementMethod() 。 下面是一个使用一个LinearLayout的exmple 。

main.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
> 
<TextView 
 android:id="@+id/tv1"
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 android:text="@string/hello"
/>
</LinearLayout>

WordExtractTest.java


public class WordExtractTest extends Activity {

 TextView tv1;

/** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);

 tv1 = (TextView)findViewById(R.id.tv1);

 loadDoc();
 }

 private void loadDoc(){

 String s ="";

 for(int x=0;x<=100;x++){
 s +="Line:"+String.valueOf(x)+"n";
 }

 tv1.setMovementMethod(new ScrollingMovementMethod());

 tv1.setText(s);

 }
}

偶然地发现了这一点: 我可能在这里唤醒僵尸。 但是要回答这个问题,你可以:
1.围绕着 TextViewScrollView 或者
2.将移动方法设置为 ScrollingMovementMethod.getInstance();

我找到了最好的方法:

用带有这些额外属性的EditText替换 TextView:


android:background="@null"
android:editable="false"
android:cursorVisible="false"

不需要在ScrollView中包装。

这是"如何将滚动条应用到 textview",只使用 XML?

首先,你需要在 main.xml 文件中使用Textview控件并将一些文本写入其中。。 就像这个:


<TextView 
 android:id="@+id/TEXT" 
 android:layout_height="wrap_content" 
 android:layout_width="wrap_content" 
 android:text="@string/long_text"/>

接下来,在scrollview之间放置文本视图控件,以显示此文本的滚动条:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:orientation="vertical" 
 android:layout_height="wrap_content" 
 android:layout_width="fill_parent"> 

 <ScrollView 
 android:id="@+id/ScrollView01" 
 android:layout_height="150px" 
 android:layout_width="fill_parent"> 

 <TextView 
 android:id="@+id/TEXT" 
 android:layout_height="wrap_content" 
 android:layout_width="wrap_content" 
 android:text="@string/long_text"/> 

 </ScrollView>
</RelativeLayout>

就是这样。。

如果希望在textview中滚动文本,则可以执行以下操作:

首先必须必须子类化 textview 。

然后使用。

下面是一个子类化textview的示例。


public class AutoScrollableTextView extends TextView {


 public AutoScrollableTextView(Context context, AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
 setEllipsize(TruncateAt.MARQUEE);
 setMarqueeRepeatLimit(-1);
 setSingleLine();
 setHorizontallyScrolling(true);
 }

 public AutoScrollableTextView(Context context, AttributeSet attrs) {
 super(context, attrs);
 setEllipsize(TruncateAt.MARQUEE);
 setMarqueeRepeatLimit(-1);
 setSingleLine();
 setHorizontallyScrolling(true);
 }

 public AutoScrollableTextView(Context context) {
 super(context); 
 setEllipsize(TruncateAt.MARQUEE);
 setMarqueeRepeatLimit(-1);
 setSingleLine();
 setHorizontallyScrolling(true);

 }
 @Override
 protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
 if(focused)
 super.onFocusChanged(focused, direction, previouslyFocusedRect);
 }

 @Override
 public void onWindowFocusChanged(boolean focused) {
 if(focused)
 super.onWindowFocusChanged(focused);
 }


 @Override
 public boolean isFocused() {
 return true;
 }
}

现在,你必须以这种方式在xml中使用它,


 <com.yourpackagename.AutoScrollableTextView
 android:layout_width="fill_parent"
 android:layout_height="wrap_content" 
 android:text="This is very very long text to be scrolled"
/>

就是这样。

这将提供带有滚动条的平滑滚动文本。


ScrollView scroller = new ScrollView(this);
TextView tv = new TextView(this);
tv.setText(R.string.my_text);
scroller.addView(tv);

...