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);
¿Fue útil?

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:

  1. android:fillViewport="true" combinado con android:layout_weight="1.0" hará que el TextView ocupar todo el espacio disponible.

  2. 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

  1. rodear el TextView por un ScrollView; o
  2. 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:

  1. 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>
    
  2. 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top