Hacer TextView desplazable en Android

Estoy mostrando texto en una vista de texto 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); 

No es necesario utilizar un ScrollView realidad.

Solo configura el

 android:scrollbars = "vertical" 

propiedades de su TextView en el archivo xml de su diseño.

Luego usa:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

en tu código

Bingo, se desplaza!

Así es como lo hice puramente en XML:

       

NOTAS:

  1. android:fillViewport="true" combinado con android:layout_weight="1.0" hará que la vista de texto ocupe todo el espacio disponible.

  2. Al definir la vista de desplazamiento, NO especifique android:layout_height="fill_parent" contrario, la vista de desplazamiento no funcionará. (Esto me ha causado perder una hora ahora mismo! FFS).

CONSEJO PRO:

Para desplazarse mediante progtwigción hacia la parte inferior después de agregar texto, use esto:

 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 realmente es necesario es el setMovementMethod (). Aquí hay un ejemplo usando LinearLayout.

Archivo main.xml

     

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 que su vista de texto solo agregue esto

 TextView textview= (TextView) findViewById(R.id.your_textview_id); textview.setMovementMethod(new ScrollingMovementMethod()); 

No es necesario poner

 android:Maxlines="AN_INTEGER"` 

Puedes hacer tu trabajo simplemente agregando:

 android:scrollbars = "vertical" 

Y pon este código en tu clase de Java:

 textview.setMovementMethod(new ScrollingMovementMethod()); 

Tu también puedes

  1. rodear el TextView por un ScrollView ; o
  2. establece el método de Movimiento en ScrollingMovementMethod.getInstance(); .

La mejor manera que encontré:

Reemplace el TextView con un EditText con estos atributos adicionales:

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

No hay necesidad de envolver en un ScrollView.

Este es “Cómo aplicar ScrollBar a su TextView”, utilizando solo XML.

Primero, necesita tomar un control Textview en el archivo main.xml y escribir algo de texto … como este:

  

A continuación, coloque el control de vista de texto entre la vista de desplazamiento para mostrar la barra de desplazamiento para este texto:

      

Eso es…

Sencillo. Así es como lo hice:

  1. Lado XML:

         
  2. Lado de Java:

     tv_log = (TextView) findViewById(R.id.tv_log); tv_log.setMovementMethod(new ScrollingMovementMethod()); 

Prima:

Para permitir que la vista de texto se desplace hacia abajo a medida que el texto la completa, debe agregar:

  android:gravity="bottom" 

al archivo TextView xml. Se desplazará hacia abajo automáticamente a medida que ingrese más texto.

Por supuesto, necesita agregar el texto usando la función de agregar en lugar de configurar el texto:

  tv_log.append("\n" + text); 

Lo usé para propósito de registro.

Espero que esto ayude 😉

El “consejo profesional” de Someone Somewhere ( Hacer que TextView se pueda desplazar en Android ) funciona muy bien; sin embargo, ¿qué sucede si agregas texto dinámicamente a ScrollView y deseas desplazarte automáticamente a la parte inferior después de anexar 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 que no desea restablecer automáticamente al final durante un apéndice, lo cual sería molesto).

De todos modos, aquí está:

 if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <= (mScrollView.getHeight() + mTextStatus.getLineHeight())) { scrollToBottom(); } 

MTextStatus.getLineHeight () lo hará para que no haga scrollToBottom () si el usuario está dentro de una línea desde el final de ScrollView.

Esto proporcionará un texto de 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 dispare dentro de la vista de texto, puede seguir lo siguiente:

Primero deberías tener que subclasificar la vista de texto.

Y luego usa eso.

A continuación se muestra un ejemplo de una vista de texto subclasificada.

 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, tienes que usar eso en el XML de esta manera:

   

Eso es.

No encontré el desplazamiento de TextView para admitir el gesto ‘fling’, donde continúa desplazándose después de un movimiento hacia arriba o hacia abajo. Terminé implementándolo yo mismo porque no quería usar ScrollView por varias razones, y no parecía haber un MovementMethod que me permitiera seleccionar texto y hacer clic en enlaces.

Agregue lo siguiente en la vista de texto en XML.

 android:scrollbars="vertical" 

Y finalmente, agrega

 textView.setMovementMethod(new ScrollingMovementMethod()); 

en el archivo de Java.

Cuando haya terminado de desplazarse, agregue esta línea a la última línea de la vista cuando ingrese algo en la vista:

 ((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN); 

Agregue esto a su diseño 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 tienes que escribir las siguientes líneas:

 textview.setSelected(true); textView.setMovementMethod(new ScrollingMovementMethod()); 

Si no desea utilizar la solución EditText, puede 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 vista de texto de desplazamiento horizontal automático:

Al agregar TextView a xml use

  

Establezca las siguientes propiedades de TextView en onCreate ()

 tv.setSelected(true); tv.setHorizontallyScrolling(true); 

Úselo así

  

En mi caso. Diseño de restricción. AS 2.3.

Implementación del código:

 YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod()); 

XML:

 android:scrollbars="vertical" android:scrollIndicators="right|end" 

¡Luché con esto por más de una semana y finalmente descubrí cómo hacer que esto funcione!

Mi problema era que todo se desplazaría como un ‘bloque’. El texto en sí estaba desplazándose, pero como un fragmento en lugar de línea por línea. Obviamente, esto no funcionó para mí, porque cortaría las líneas en la parte inferior. Todas las soluciones anteriores no me funcionaron, así que diseñé las mías.

Aquí está la solución más fácil de lejos:

Haga un archivo de clase llamado: ‘PerfectScrollableTextView’ dentro de un paquete, luego copie y pegue 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; } } 

Finalmente cambie su ‘TextView’ en XML:

De:

Para:

Coloque maxLines y scrollbars dentro de TextView en xml.

  

Luego en código java.

textView.setMovementMethod(new ScrollingMovementMethod());

Tuve este problema cuando estaba usando TextView dentro de 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 usar ScrollView como padre , y también use el método de desplazamiento de desplazamiento con TextView.

Y cuando retratos para cambiar el paisaje de tu dispositivo ese momento ocurre algún problema . (como) toda la página es desplazable, pero el método de desplazamiento de desplazamiento no puede funcionar.

si aún necesita usar ScrollView como método de movimiento primario o de desplazamiento, entonces también usa a continuación desc.

Si no tiene ningún problema, use EditText en lugar de TextView

vea abajo :

  

Aquí, EditText se comporta como TextView

Y tu problema se resolverá