Pergunta

Estou exibindo texto em uma visão de texto que parece ser muito longa para caber em uma tela. Eu preciso tornar minha visão de texto rolável. Como eu posso fazer isso?

Aqui está o 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);
Foi útil?

Solução

Você não precisa usar um ScrollView na realidade.

Basta definir o

android:scrollbars = "vertical"

propriedades do seu TextView no arquivo XML do seu layout.

Em seguida, use:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

em seu código.

Bingo, ele rola!

Outras dicas

Foi assim que fiz isso puramente em 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 com android:layout_weight="1.0" fará com que o TextView ocupe todo o espaço disponível.

  2. Ao definir o scrollView, não especifique android:layout_height="fill_parent" Caso contrário, o ScrollView não funciona! (Isso me fez perder uma hora agora! FFS).

Dica profissional:

Para rolar programaticamente para o fundo após a anexagem do texto, use o seguinte:

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());
        }
    });
}

Tudo o que é realmente necessário é o SetMovementMethod (). Aqui está um exemplo usando um linearlayout.

Arquivo 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>

Arquivo 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);
    }
}

Faça seu TextView apenas adicionando isso

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

Não é necessário colocar

android:Maxlines="AN_INTEGER"`

Você pode fazer seu trabalho simplesmente adicionando:

android:scrollbars = "vertical"

E coloque este código em sua classe Java:

textview.setMovementMethod(new ScrollingMovementMethod());

Você também pode

  1. cercar o TextView por a ScrollView; ou
  2. Defina o método de movimento para ScrollingMovementMethod.getInstance();.

A melhor maneira que encontrei:

Substitua o TextView por um EditText com estes atributos extras:

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

Não há necessidade de embrulhar em um scrollView.

É "como aplicar a barra de rolagem ao seu TextView", usando apenas XML.

Primeiro, você precisa assumir um controle de visão de texto no main.xml Arquive e escreva algum texto nele ... assim:

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

Em seguida, coloque o controle de exibição de texto entre o ScrollView para exibir a barra de rolagem 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>

É isso...

Simples. Foi assim que eu fiz:

  1. Lado 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. Java Lado:

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

Bônus:

Para deixar o texto visualizar rolar para baixo enquanto o texto o preenchem, você deve adicionar:

    android:gravity="bottom"

para o arquivo XML do TextView. Ele rolará para baixo automaticamente à medida que mais texto chegar.

Claro que você precisa adicionar o texto usando a função Anexe em vez de definir texto:

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

Eu o usei para fins de log.

Eu espero que isso ajude ;)

A "dica profissional" acima de alguém em algum lugar (Tornando o TextView rolável no Android) Funciona muito bem, no entanto, e se você estiver adicionando dinamicamente o texto ao ScrollView e gostaria de rolar automaticamente para o fundo após um anexo Quando o usuário está na parte inferior do scrollView? (Talvez porque se o usuário rolou para ler algo, você não deseja redefinir automaticamente para o fundo durante um anexo, o que seria irritante.)

Enfim, aqui está:

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

O mtextStatus.getLineHeight () fará com que você não scrollTobottom () se o usuário estiver dentro de uma linha a partir do final do scrollView.

Isso fornecerá um texto de rolagem suave com uma barra de rolagem.

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

Se você deseja que o texto seja rolado dentro do TextView, você pode seguir o seguinte:

Primeiro, você deve ter que subclasse TextView.

E então use isso.

A seguir, é apresentado um exemplo de uma visualização de texto subclassificada.

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;
    }
}

Agora, você tem que usar isso no XML dessa maneira:

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

É isso.

Não encontrei rolagem de textwiew para apoiar o gesto 'Fling', onde ele continua rolando após um movimento para cima ou para baixo. Acabei implementando isso, porque não queria usar um ScrollView por vários motivos, e não parecia haver um movimento de movimento que me permitiram selecionar texto e clicar em links.

Adicione o seguinte no TextView no XML.

android:scrollbars="vertical"

E finalmente, adicione

textView.setMovementMethod(new ScrollingMovementMethod());

No arquivo java.

Quando terminar com rolagem, adicione esta linha à última linha da visualização quando inserir qualquer coisa na visualização:

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

Adicione isso ao seu layout 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"

E no código, você deve escrever as seguintes linhas:

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

Se você não quiser usar a solução EDITTEXT, poderá ter mais sorte com:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.yourLayout);
    (TextView)findViewById(R.id.yourTextViewId).setMovementMethod(ArrowKeyMovementMethod.getInstance());
}

O código abaixo cria uma visualização de rolagem horizontal automática:

Ao adicionar TextView ao uso XML

<TextView android:maxLines="1" 
          android:ellipsize="marquee"
          android:scrollHorizontally="true"/>

Defina as seguintes propriedades do TextView em OnCreate ()

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

Use assim

<TextView  
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:maxLines = "AN_INTEGER"
    android:scrollbars = "vertical"
/>

Em Kotlin para tornar o TextView rolável

myTextView.movementMethod= ScrollingMovementMethod()

e também adicione xml esta propriedade

    android:scrollbars = "vertical"

No meu caso.Constraint Layout.As 2.3.

Implementação de código:

YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());

Xml:

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

Colocar maxLines e scrollbars Inside TextView em XML.

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    android:maxLines="5" // any number of max line here.
    />

Então, no código Java.

textView.setMovementMethod(new ScrollingMovementMethod());

Eu tive esse problema quando estava usando TextView dentro de ScrollView. Esta solução funcionou para mim.

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;
            }
        });

sempre que você precisar Use o ScrollView como pai, E você também usa o método de movimento de rolagem com o TextView.

E quando você Retrato para a paisagem do seu dispositivo esse tempo ocorrem algum problema. (como) a página inteira é rolável, mas o método de movimento de rolagem não pode funcionar.

Se você ainda precisar usar o ScrollView como método de movimento pai ou rolagem, também usa abaixo o DEC.

Se você não tiver problemas, usa o EditText em vez de TextView

Veja abaixo :

<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"/>

Aqui, o EdittEXT se comporta como TextView

E seu problema será resolvido

Xml - você pode usar android:scrollHorizontally Atributo

Se o texto pode ser mais largo que a visualização (e, portanto, pode ser rolada horizontalmente).

Pode ser um valor booleano, como "verdadeiro" ou "falso".

Prigramacalia - setHorizontallyScrolling(boolean)

Experimente isso:

android:scrollbars = "vertical"

Eu lutei com isso por mais de uma semana e finalmente descobri como fazer isso funcionar!

Meu problema era que tudo rolaria como um 'bloco'. O texto em si estava rolando, mas como um pedaço, em vez de linha por linha. Obviamente, isso não funcionou para mim, porque cortaria as linhas na parte inferior. Todas as soluções anteriores não funcionaram para mim, então eu criei o meu.

Aqui está a solução mais fácil de longe:

Faça um arquivo de classe chamado: 'PerfectScrollableTextView' dentro de um pacote e copie e cole este código em:

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, mude sua 'TextView' em XML:

A partir de: <TextView

Para: <com.your_app_goes_here.PerfectScrollableTextView

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top