Rendere TextView scorrevole su Android
Domanda
Sto visualizzando il testo in un TextView che sembra essere troppo lungo per adattarsi a una schermata.Devo rendere scorrevole il mio TextView.Come lo posso fare?
Ecco il codice:
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);
Soluzione
Non è necessario utilizzare un ScrollView
realtà.
Basta impostare il
android:scrollbars = "vertical"
proprietà del vostro TextView
in file xml del layout.
Quindi utilizzare:
yourTextView.setMovementMethod(new ScrollingMovementMethod());
nel codice.
Bingo, scorre!
Altri suggerimenti
Questo è come ho fatto puramente in 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>
Note:
-
android:fillViewport="true"
combinato conandroid:layout_weight="1.0"
farà la TextView occupano tutto lo spazio disponibile. -
Quando si definisce lo Scrollview, non è necessario specificare
android:layout_height="fill_parent"
altrimenti la ScrollView non funziona! (Questo mi ha indotto a sprecare un'ora solo ora! FFS).
PRO TIP:
Per scorrere di programmazione fino in fondo dopo aggiungendo testo, utilizzare questo:
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());
}
});
}
Tutto ciò che è veramente necessario è il setMovementMethod (). Ecco un esempio utilizzando un LinearLayout.
File 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>
File 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);
}
}
Fai la tua TextView solo l'aggiunta di questo
TextView textview= (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(new ScrollingMovementMethod());
Non è necessario mettere in
android:Maxlines="AN_INTEGER"`
Si può fare il vostro lavoro semplicemente aggiungendo:
android:scrollbars = "vertical"
E, inserire questo codice nella classe Java:
textview.setMovementMethod(new ScrollingMovementMethod());
È possibile
- circondare la
TextView
da unScrollView
; o - impostare il metodo di movimento per
ScrollingMovementMethod.getInstance();
.
Il modo migliore che ho trovato:
Sostituire la TextView con un'EditText con questi attributi extra:
android:background="@null"
android:editable="false"
android:cursorVisible="false"
Non è necessario per avvolgere in uno ScrollView.
Questa è "Come applicare scrollbar al vostro TextView", utilizzando solo XML.
In primo luogo, è necessario prendere un controllo TextView nel main.xml di file e scrivere un testo in esso ... in questo modo:
<TextView
android:id="@+id/TEXT"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/long_text"/>
Quindi, posizionare il controllo di visualizzazione del testo tra lo ScrollView per visualizzare la barra di scorrimento per questo testo:
<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>
Questo è tutto ...
Semplice. Ecco come ho fatto:
-
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>
-
lato Java:
tv_log = (TextView) findViewById(R.id.tv_log); tv_log.setMovementMethod(new ScrollingMovementMethod());
Bonus:
Per consentire lo scorrimento vista testo verso il basso come il testo riempirla, si deve aggiungere:
android:gravity="bottom"
per il file xml TextView. Sarà scorrere verso il basso automaticamente come più testo entra in gioco.
Naturalmente è necessario aggiungere il testo utilizzando la funzione di accodamento al posto del testo insieme:
tv_log.append("\n" + text);
L'ho usato per Log scopo.
Spero che questo aiuta;)
Il "suggerimento professionale" riportato sopra da Someone Somewhere (Rendere TextView scorrevole su Android) funziona benissimo, tuttavia, cosa succede se stai aggiungendo dinamicamente testo a ScrollView e desideri scorrere automaticamente fino in fondo dopo un'aggiunta? soltanto quando l'utente si trova nella parte inferiore di ScrollView?(Forse perché se l'utente ha fatto scorrere verso l'alto per leggere qualcosa, non vuoi ripristinare automaticamente la fine durante un'aggiunta, il che sarebbe fastidioso.)
Comunque eccolo qui:
if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <=
(mScrollView.getHeight() + mTextStatus.getLineHeight())) {
scrollToBottom();
}
mTextStatus.getLineHeight() farà in modo che tu non scrollToBottom() se l'utente si trova all'interno di una riga dalla fine di ScrollView.
Ciò fornirà il testo scorrimento continuo con una barra di scorrimento.
ScrollView scroller = new ScrollView(this);
TextView tv = new TextView(this);
tv.setText(R.string.my_text);
scroller.addView(tv);
Se si desidera che il testo di scorrere all'interno del TextView, allora si può seguire il seguente:
In primo luogo si dovrebbe avere per sottoclasse TextView.
E poi usare quella.
Di seguito è riportato un esempio di un TextView sottoclasse.
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;
}
}
Ora, è necessario utilizzare che in XML in questo modo:
<com.yourpackagename.AutoScrollableTextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is very very long text to be scrolled"
/>
Questo è tutto.
Non ho trovato TextView scorrimento per sostenere il gesto 'scappatella', dove continua lo scorrimento dopo un colpo su o giù. Ho finito per l'attuazione che me stesso, perché non volevo usare uno ScrollView per vari motivi, e non c'è sembrato di essere un MovementMethod che entrambi mi ha permesso di selezionare il testo e fare clic sui link.
Aggiungere la seguente nel TextView in XML.
android:scrollbars="vertical"
E, infine, aggiungere
textView.setMovementMethod(new ScrollingMovementMethod());
nel file Java.
Quando si è fatto con scorrevole, aggiungere questa riga all'ultima riga della vista quando si entra nulla nella vista:
((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN);
Aggiungi questo al 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 nel codice si deve scrivere le seguenti righe:
textview.setSelected(true);
textView.setMovementMethod(new ScrollingMovementMethod());
Se non si desidera utilizzare la soluzione EditText allora si potrebbe avere più fortuna con:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.yourLayout);
(TextView)findViewById(R.id.yourTextViewId).setMovementMethod(ArrowKeyMovementMethod.getInstance());
}
Il codice di seguito crea un TextView automatica scorrimento orizzontale:
Mentre l'aggiunta di TextView utilizzare XML
<TextView android:maxLines="1"
android:ellipsize="marquee"
android:scrollHorizontally="true"/>
Impostare le seguenti proprietà di TextView a onCreate ()
tv.setSelected(true);
tv.setHorizontallyScrolling(true);
Utilizzare in questo modo
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:maxLines = "AN_INTEGER"
android:scrollbars = "vertical"
/>
In Kotlin per rendere il TextView scorrevole
myTextView.movementMethod= ScrollingMovementMethod()
e anche aggiungere in XML questa proprietà
android:scrollbars = "vertical"
Nel mio case.Constraint Layout.AS 2.3.
implementazione Codice:
YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());
XML:
android:scrollbars="vertical"
android:scrollIndicators="right|end"
Mettere maxLines
e scrollbars
all'interno TextView in XML.
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:maxLines="5" // any number of max line here.
/>
Poi nel codice Java.
textView.setMovementMethod(new ScrollingMovementMethod());
Ho avuto questo problema quando stavo usando TextView
all'interno del ScrollView
. Questa soluzione ha funzionato per me.
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;
}
});
ogni volta che è necessario utilizzare la ScrollView come genitore , e anche voi utilizza il metodo movimento di scorrimento con TextView.
E quando si verticale a orizzontale del dispositivo che il tempo si verificano una certa edizione . (Come) intera pagina è scorrevole ma il metodo movimento di scorrimento non può funzionare.
se hai ancora bisogno di utilizzare ScrollView come genitore o di un metodo di movimento di scorrimento quindi si utilizza anche sotto disc.
Se non avete problemi allora utilizzare EditText invece di TextView
vedi sotto:
<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"/>
Qui, l'EditText si comporta come TextView
E il problema sarà risolto
XML - È possibile utilizzare android:scrollHorizontally
attributo
Se il testo è permesso di essere più larga della vista (e, pertanto, è possibile scorrere in orizzontale).
Può essere un valore booleano, come ad esempio "vero" o "falso".
Prigramacaly - setHorizontallyScrolling(boolean)
Prova questo:
android:scrollbars = "vertical"
Ho lottato con questo per oltre una settimana e finalmente capito come fare questo lavoro!
Il mio problema era che tutto sarebbe scorrere come un 'blocco'. Il testo stesso stava scorrendo, ma come un pezzo piuttosto che riga per riga. Questo, ovviamente, non ha funzionato per me, perché sarebbe tagliare le linee nella parte inferiore. Tutte le soluzioni precedenti non ha funzionato per me, così ho crafted mio.
Questa è la soluzione più semplice in assoluto:
Crea un file di classe denominato: 'PerfectScrollableTextView' all'interno di un pacchetto, quindi copiare e incollare questo codice in:
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;
}
}
cambiare Infine la tua 'TextView' in XML:
Da: <TextView
A: <com.your_app_goes_here.PerfectScrollableTextView