在Android上使TextView可以滚动
我在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"
您的布局的XML文件中的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>
笔记:
-
android:fillViewport="true"
结合android:layout_weight="1.0"
将使得textview占用所有可用的空间。 -
定义滚动视图时,不要指定
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的例子。
文件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); } }
让你的textview只是添加这个
TextView textview= (TextView) findViewById(R.id.your_textview_id); textview.setMovementMethod(new ScrollingMovementMethod());
你也可以
- 通过
ScrollView
环绕TextView
; 要么 - 将Movement方法设置为
ScrollingMovementMethod.getInstance();
。
没有必要投入
android:Maxlines="AN_INTEGER"`
你可以通过简单的添加来完成你的工作:
android:scrollbars = "vertical"
而且,把这个代码放到你的Java类中:
textview.setMovementMethod(new ScrollingMovementMethod());
我发现的最好的方法是:
用这些额外的属性replaceTextView与EditText:
android:background="@null" android:editable="false" android:cursorVisible="false"
不需要在ScrollView中进行包装。
上面的某个地方的“专业提示”( 在Android上制作TextView可滚动 )非常适用,但是,如果您要向ScrollViewdynamic添加文本,并且希望只在用户位于附件时自动滚动到底部ScrollView的底部? (也许是因为如果用户已经滚动阅读一些你不想在追加期间自动重置到底部的东西,这将是恼人的。)
无论如何,这里是:
if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <= (mScrollView.getHeight() + mTextStatus.getLineHeight())) { scrollToBottom(); }
mTextStatus.getLineHeight()会让你不用scrollToBottom(),如果用户在ScrollView结尾的一行内。
这是“如何将ScrollBar应用到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"/>
接下来,将文本视图控件放置在滚动视图之间以显示此文本的滚动条:
<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>
而已…
这将提供一个滚动条平滑的滚动文本。
ScrollView scroller = new ScrollView(this); TextView tv = new TextView(this); tv.setText(R.string.my_text); scroller.addView(tv);
如果你想让文本在textview中滚动,那么你可以按照下面的步骤进行操作:
首先,你应该不得不inheritancetextview。
然后用那个。
以下是一个子类文本视图的例子。
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" />
而已。
简单。 这是我做到的:
-
XML方面:
<?xml version="1.0" encoding="utf-8"?> <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:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" tools:context="com.mbh.usbcom.MainActivity"> <TextView android:id="@+id/tv_log" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="vertical" android:text="Log:" /> </RelativeLayout>
-
Java方面:
tv_log = (TextView) findViewById(R.id.tv_log); tv_log.setMovementMethod(new ScrollingMovementMethod());
奖金:
要让文本视图在文本填充时向下滚动,必须添加:
android:gravity="bottom"
到TextView的xml文件。 随着更多文本的进入,它会自动向下滚动。
当然,你需要使用附加function而不是设置文本添加文本:
tv_log.append("\n" + text);
我用它作为日志的目的,所以。
我希望这有帮助 ;)
我没有findTextView的滚动来支持“一甩”的手势,在上下滑动后继续滚动。 我结束了自己的实现,因为我不想使用ScrollView出于各种原因,似乎没有一个MovementMethod都允许我select文本,并点击链接。
当您完成可滚动操作时,在视图中input任何内容时,将此行添加到视图的最后一行:
((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN);
添加到您的XML布局:
android:ellipsize="marquee" android:focusable="false" android:marqueeRepeatLimit="marquee_forever" android:scrollHorizontally="true" android:singleLine="true" android:text="To Make An textView Scrollable Inside The TextView Using Marquee"
而在代码中,你必须写下面几行:
textview.setSelected(true); textView.setMovementMethod(new ScrollingMovementMethod());
在XML中的textview中添加以下内容。
android:scrollbars="vertical"
最后,添加
textView.setMovementMethod(new ScrollingMovementMethod());
在Java文件中。
如果你不想使用EditText解决scheme,那么你可能有更好的运气:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.yourLayout); (TextView)findViewById(R.id.yourTextViewId).setMovementMethod(ArrowKeyMovementMethod.getInstance()); }
下面的代码创build一个自动水平滚动textview:
在添加TextView的同时使用xml
<TextView android:maxLines="1" android:ellipsize="marquee" android:scrollHorizontally="true"/>
在onCreate()中设置TextView的以下属性
tv.setSelected(true); tv.setHorizontallyScrolling(true);
像这样使用它
<TextView android:layout_width="match_parent" android:layout_height="match_parent" android:maxLines = "AN_INTEGER" android:scrollbars = "vertical />
在我的情况.Constraint Layout.AS 2.3。
代码实现:
YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());
XML:
android:scrollbars="vertical" android:scrollIndicators="right|end"
我为此奋斗了一个多星期,终于想出了如何做到这一点!
我的问题是,一切将滚动为“块”。 文本本身是滚动,但作为一个块,而不是逐行。 这显然不适合我,因为它会切断底部的线条。 所有以前的解决scheme都不适合我,所以我制作了我自己的。
这是迄今为止最简单的解决scheme:
在一个包中创build一个名为“PerfectScrollableTextView”的类文件,然后复制并粘贴这个代码:
import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.widget.TextView; public class PerfectScrollableTextView extends TextView { public PerfectScrollableTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setVerticalScrollBarEnabled(true); setHorizontallyScrolling(false); } public PerfectScrollableTextView(Context context, AttributeSet attrs) { super(context, attrs); setVerticalScrollBarEnabled(true); setHorizontallyScrolling(false); } public PerfectScrollableTextView(Context context) { super(context); setVerticalScrollBarEnabled(true); setHorizontallyScrolling(false); } @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中改变你的'TextView':
来自: <TextView
要: <com.your_app_goes_here.PerfectScrollableTextView