Hacer que TextView sea desplazable en Android
Pregunta
Estoy mostrando texto en una vista textview que parece ser demasiado larga para caber en una pantalla.Necesito hacer que mi TextView sea desplazable.¿Cómo puedo hacer eso?
Aquí está el código:
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);
Solución
No es necesario utilizar un ScrollView
realidad.
Sólo hay que establecer el
android:scrollbars = "vertical"
propiedades de su TextView
en el archivo XML de su diseño.
A continuación, utilice:
yourTextView.setMovementMethod(new ScrollingMovementMethod());
en el código.
Bingo, que se desplaza!
Otros consejos
Esta es la forma en que lo hice puramente en 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>
NOTAS:
-
android:fillViewport="true"
combinado conandroid:layout_weight="1.0"
hará que el TextView ocupar todo el espacio disponible. -
Al definir el ScrollView, no se especifica lo contrario el
android:layout_height="fill_parent"
ScrollView no funciona! (Esto me ha hecho perder una hora justo ahora! FFS).
TIP PRO:
Para desplazarse a la parte inferior mediante programación después añadiendo texto, utilice la siguiente:
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());
}
});
}
Todo lo que es realmente necesario es el setMovementMethod (). He aquí un ejemplo usando un LinearLayout.
Archivo 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>
Archivo 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);
}
}
Haga su TextView sólo añadir este
TextView textview= (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(new ScrollingMovementMethod());
No es necesario poner en
android:Maxlines="AN_INTEGER"`
Puede hacer su trabajo, simplemente añadiendo:
android:scrollbars = "vertical"
Y, poner este código en su clase Java:
textview.setMovementMethod(new ScrollingMovementMethod());
Puede
- rodear el
TextView
por unScrollView
; o - establecer el método de Movimiento para
ScrollingMovementMethod.getInstance();
.
La mejor manera que he encontrado:
Reemplazar el TextView con un EditarTexto con estos atributos adicionales:
android:background="@null"
android:editable="false"
android:cursorVisible="false"
No hay necesidad de envolver en una ScrollView.
Esto es "Cómo aplicar scrollbar a su Vista de Texto", usando sólo XML.
En primer lugar, es necesario tener un control Textview en el main.xml archivo y escribir algún texto en ella ... como esto:
<TextView
android:id="@+id/TEXT"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/long_text"/>
A continuación, coloque el control de vista de texto entre las ScrollView para mostrar la barra de desplazamiento para este texto:
<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>
Eso es todo ...
simple. Esto es cómo lo hice:
-
Side 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>
-
lado de Java:
tv_log = (TextView) findViewById(R.id.tv_log); tv_log.setMovementMethod(new ScrollingMovementMethod());
Bono:
Para que la vista de texto de desplazamiento hacia abajo como el texto llenarlo, hay que añadir:
android:gravity="bottom"
en el fichero XML Vista de Texto. Se desplazará automáticamente a medida que más se presenta en el texto.
Por supuesto, hay que añadir el texto usando la función de agregación en lugar de texto conjunto:
tv_log.append("\n" + text);
Lo utilicé para fines de registro.
Espero que esto ayude;)
El "consejo profesional" anterior de Alguien en algún lugar (Hacer que TextView sea desplazable en Android) funciona muy bien, sin embargo, ¿qué sucede si agrega texto dinámicamente a ScrollView y desea desplazarse automáticamente hasta la parte inferior después de agregar? solo cuando el usuario está en la parte inferior de ScrollView?(Tal vez porque si el usuario se ha desplazado hacia arriba para leer algo, no desea restablecerlo automáticamente al final durante una adición, lo cual sería molesto).
De todos modos, aquí está:
if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <=
(mScrollView.getHeight() + mTextStatus.getLineHeight())) {
scrollToBottom();
}
mTextStatus.getLineHeight() hará que no hagas scrollToBottom() si el usuario está dentro de una línea desde el final de ScrollView.
Esto proporcionará texto con desplazamiento suave con una barra de desplazamiento.
ScrollView scroller = new ScrollView(this);
TextView tv = new TextView(this);
tv.setText(R.string.my_text);
scroller.addView(tv);
Si desea que el texto se desplaza dentro de la Vista de Texto, a continuación, se puede seguir el siguiente:
En primer lugar debe tener una subclase TextView.
Y a continuación, utilizar eso.
A continuación se presenta un ejemplo de un TextView subclase.
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;
}
}
Ahora, usted tiene que utilizar que en el XML de esta manera:
<com.yourpackagename.AutoScrollableTextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is very very long text to be scrolled"
/>
Eso es todo.
no he encontrado TextView desplazamiento para apoyar el gesto 'aventura', donde sigue desplazándose después de un movimiento hacia arriba o hacia abajo. Terminé la aplicación de esa misma porque yo no quería utilizar una ScrollView por diversas razones, y no parecía ser un MovementMethod que tanto me permitió seleccionar el texto y hacer clic en enlaces.
Agregue la siguiente en el TextView en XML.
android:scrollbars="vertical"
Y, por último, añadir
textView.setMovementMethod(new ScrollingMovementMethod());
en el archivo Java.
Cuando haya terminado con desplazable, añadir esta línea a la última línea de la vista cuando se introduce nada en la vista:
((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN);
Agregue esto a su disposición 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"
Y en el código que tiene que escribir las siguientes líneas:
textview.setSelected(true);
textView.setMovementMethod(new ScrollingMovementMethod());
Si no desea utilizar la solución EditarTexto entonces usted podría tener mejor suerte con:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.yourLayout);
(TextView)findViewById(R.id.yourTextViewId).setMovementMethod(ArrowKeyMovementMethod.getInstance());
}
El siguiente código crea una TextView automática el desplazamiento horizontal:
Mientras que la adición TextView utilizar XML
<TextView android:maxLines="1"
android:ellipsize="marquee"
android:scrollHorizontally="true"/>
Establecer las siguientes propiedades de TextView en onCreate ()
tv.setSelected(true);
tv.setHorizontallyScrolling(true);
Se usa como esto
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:maxLines = "AN_INTEGER"
android:scrollbars = "vertical"
/>
En Kotlin para hacer el TextView desplazable
myTextView.movementMethod= ScrollingMovementMethod()
y también añadir en esta propiedad XML
android:scrollbars = "vertical"
En mi case.Constraint Layout.AS 2.3.
aplicación Código:
YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());
XML:
android:scrollbars="vertical"
android:scrollIndicators="right|end"
Ponga maxLines
y scrollbars
dentro TextView en XML.
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:maxLines="5" // any number of max line here.
/>
Luego, en el código de Java.
textView.setMovementMethod(new ScrollingMovementMethod());
he tenido este problema cuando yo estaba usando TextView
dentro del ScrollView
. Esta solución ha funcionado para mí.
scrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
description.getParent().requestDisallowInterceptTouchEvent(false);
return false;
}
});
description.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
description.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
cada vez que necesite utilizar el ScrollView como padre , y también se utiliza el método de desplazamiento con movimiento Vista de Texto.
Y cuando vertical a horizontal dispositivo ese momento se produce algún problema . (Como) la totalidad de la página es desplazable pero el método movimiento de desplazamiento no puede funcionar.
si todavía necesita utilizar ScrollView como padre o método de movimiento de desplazamiento, entonces también utilizar por debajo de la descripción.
Si usted no tiene ningún problema, entonces utilizar EditarTexto en lugar de Vista de Texto
ver más abajo:
<EditText
android:id="@+id/description_text_question"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:editable="false"
android:cursorVisible="false"
android:maxLines="6"/>
Aquí, el EditarTexto comporta como Vista de Texto
Y el problema se resolverá
XML - Se puede usar android:scrollHorizontally
Atributo
Si se permite que el texto para ser más ancha que la vista (y por lo tanto se puede desplazar horizontalmente).
puede ser un valor booleano, tales como "verdadero" o "falso".
Prigramacaly - setHorizontallyScrolling(boolean)
Prueba esto:
android:scrollbars = "vertical"
Luché con esto por más de una semana y finalmente descubierto la manera de hacer este trabajo!
Mi problema era que todo iba a desplazarse como un 'bloque'. El texto en sí se desplazaba, sino como un trozo en lugar de línea por línea. Obviamente, esto no funcionó para mí, porque sería cortar las líneas en la parte inferior. Todas las soluciones anteriores no funcionó para mí, por lo que hace a mano la mía.
Esta es la solución más fácil por el momento:
Hacer un archivo de clase llamada: 'PerfectScrollableTextView' dentro de un paquete, a continuación, copiar y pegar este código en:
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;
}
}
Por último cambiar su 'Vista de Texto' en XML:
De: <TextView
Para: <com.your_app_goes_here.PerfectScrollableTextView