Tornando o TextView rolável no Android
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);
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:
android:fillViewport="true"
combinado comandroid:layout_weight="1.0"
fará com que o TextView ocupe todo o espaço disponível.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
- cercar o
TextView
por aScrollView
; ou - 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:
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>
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 só 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