Ich zeige Text in einer Textansicht an, die zu lang zu sein scheint, um _ in einen Bildschirm zu passen. Ich muss meine TextView scrollbar machen. Wie kann ich das machen?
Hier ist der Code:
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);
Sie müssen tatsächlich kein ScrollView
verwenden.
Einfach das einstellen
Android:scrollbars = "vertical"
eigenschaften Ihres TextView
in der XML-Datei Ihres Layouts.
Dann benutze:
yourTextView.setMovementMethod(new ScrollingMovementMethod());
in deinem Code.
Bingo, es scrollt!
So habe ich es rein in XML gemacht:
<?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>
ANMERKUNGEN:
Durch Android:fillViewport="true"
in Kombination mit Android:layout_weight="1.0"
nimmt die Textansicht den gesamten verfügbaren Platz ein.
Geben Sie bei der Definition der Bildlaufansicht NICHT Android:layout_height="fill_parent"
an, sonst funktioniert die Bildlaufansicht nicht! (Das hat mich gerade dazu veranlasst, eine Stunde zu verschwenden! FFS).
PRO TIPP:
Um nach dem Anhängen von Text programmatisch nach unten zu blättern, verwenden Sie Folgendes:
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());
}
});
}
Alles was wirklich nötig ist, ist setMovementMethod (). Hier ist ein Beispiel mit einem LinearLayout.
<?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>
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);
}
}
Erstellen Sie Ihren Text, indem Sie dies hinzufügen
TextView textview= (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(new ScrollingMovementMethod());
Es ist nicht notwendig, einzufügen
Android:Maxlines="AN_INTEGER"`
Sie können Ihre Arbeit erledigen, indem Sie einfach Folgendes hinzufügen:
Android:scrollbars = "vertical"
Und fügen Sie diesen Code in Ihre Java-Klasse ein:
textview.setMovementMethod(new ScrollingMovementMethod());
Du kannst entweder
TextView
durch eine ScrollView
; oderScrollingMovementMethod.getInstance();
.Der beste Weg, den ich gefunden habe:
Ersetzen Sie die TextView durch einen EditText mit diesen zusätzlichen Attributen:
Android:background="@null"
Android:editable="false"
Android:cursorVisible="false"
Es ist nicht notwendig, ein ScrollView einzubinden.
Dies ist "So wenden Sie ScrollBar auf Ihre TextView an" und verwenden Sie nur XML.
Zuerst müssen Sie ein Textview-Steuerelement in die Datei main.xml aufnehmen und etwas Text hineinschreiben ...
<TextView
Android:id="@+id/TEXT"
Android:layout_height="wrap_content"
Android:layout_width="wrap_content"
Android:text="@string/long_text"/>
Platzieren Sie als Nächstes das Textansicht-Steuerelement zwischen der Bildlaufansicht, um die Bildlaufleiste für diesen Text anzuzeigen:
<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>
Das ist es...
Einfach. So habe ich es gemacht:
XML-Seite:
<?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-Seite:
tv_log = (TextView) findViewById(R.id.tv_log);
tv_log.setMovementMethod(new ScrollingMovementMethod());
Damit die Textansicht nach unten scrollen kann, während der Text sie ausfüllt, müssen Sie Folgendes hinzufügen:
Android:gravity="bottom"
in die TextView-XML-Datei. Es wird automatisch nach unten gerollt, wenn mehr Text eingeht.
Natürlich müssen Sie den Text mit der Anfügefunktion anstelle des gesetzten Textes hinzufügen:
tv_log.append("\n" + text);
Ich habe es für Log-Zwecke verwendet.
Ich hoffe das hilft ;)
Der obige "Pro-Tipp" von Someone Somewhere ( TextView scrollbar auf Android - erstellen) funktioniert jedoch hervorragend. Was passiert, wenn Sie dynamisch Text zum ScrollView hinzufügen und nach einem Anhängen automatisch nach unten scrollen möchten nur, wenn sich der Benutzer unten in der ScrollView befindet? (Vielleicht, weil der Benutzer nach oben gescrollt wurde, um etwas zu lesen, möchten Sie während eines Anfügens nicht automatisch nach unten zurückkehren, was ärgerlich wäre.)
Wie auch immer, hier ist es:
if ((mTextStatus.getMeasuredHeight() - mScrollView.getScrollY()) <=
(mScrollView.getHeight() + mTextStatus.getLineHeight())) {
scrollToBottom();
}
MTextStatus.getLineHeight () macht es so, dass Sie scrollToBottom () nicht scrollen können, wenn sich der Benutzer innerhalb einer Zeile vom Ende der ScrollView befindet.
Dies sorgt für einen reibungslosen Bildlauf mit einer Bildlaufleiste.
ScrollView scroller = new ScrollView(this);
TextView tv = new TextView(this);
tv.setText(R.string.my_text);
scroller.addView(tv);
Wenn der Text innerhalb der Textansicht gescrollt werden soll, können Sie folgende Schritte ausführen:
Zuerst sollten Sie die Textansicht subclass müssen.
Und dann benutze das.
Im Folgenden finden Sie ein Beispiel für eine untergeordnete Textansicht.
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;
}
}
Nun müssen Sie das im XML auf folgende Weise verwenden:
<com.yourpackagename.AutoScrollableTextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="This is very very long text to be scrolled"
/>
Das ist es.
Fügen Sie Folgendes in der Textansicht in XML hinzu.
Android:scrollbars="vertical"
Und zum Schluss noch hinzufügen
textView.setMovementMethod(new ScrollingMovementMethod());
in der Java-Datei.
Ich habe TextView nicht gefunden, um zu scrollen, um die "Fling" -Geste zu unterstützen, bei der es nach einem Bildlauf nach oben oder unten weiter scrollt. Am Ende habe ich das selbst implementiert, weil ich aus verschiedenen Gründen kein ScrollView verwenden wollte, und es schien keine MovementMethod zu geben, die es mir erlaubte, Text auszuwählen und auf Links zu klicken.
Fügen Sie dies Ihrem XML-Layout hinzu:
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"
Und im Code musst du folgende Zeilen schreiben:
textview.setSelected(true);
textView.setMovementMethod(new ScrollingMovementMethod());
Wenn Sie mit der Bildlauffunktion fertig sind, fügen Sie diese Zeile zur letzten Zeile der Ansicht hinzu, wenn Sie etwas in die Ansicht eingeben:
((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN);
Wenn Sie die EditText-Lösung nicht verwenden möchten, haben Sie möglicherweise mehr Glück mit:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.yourLayout);
(TextView)findViewById(R.id.yourTextViewId).setMovementMethod(ArrowKeyMovementMethod.getInstance());
}
Mit dem folgenden Code wird eine automatische horizontale Bildlauf-Textansicht erstellt:
Beim Hinzufügen von TextView zu XML verwenden
<TextView Android:maxLines="1"
Android:ellipsize="Marquee"
Android:scrollHorizontally="true"/>
Legen Sie die folgenden Eigenschaften von TextView in onCreate () fest
tv.setSelected(true);
tv.setHorizontallyScrolling(true);
Verwenden Sie es so
<TextView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:maxLines = "AN_INTEGER"
Android:scrollbars = "vertical"
/>
Ich hatte mehr als eine Woche damit zu kämpfen und habe schließlich herausgefunden, wie das funktioniert.
Mein Problem war, dass alles als "Block" scrollen würde. Der Text selbst war ein Bildlauf, jedoch eher als ein Stück als Zeile für Zeile. Das funktionierte offensichtlich nicht für mich, weil es am unteren Rand Linien abschneiden würde. Alle bisherigen Lösungen haben bei mir nicht funktioniert, also habe ich meine eigenen entwickelt.
Hier ist die mit Abstand einfachste Lösung:
Erstellen Sie eine Klassendatei mit dem Namen 'PerfectScrollableTextView') in einem Paket. Kopieren Sie dann diesen Code und fügen Sie ihn in Folgendes ein:
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;
}
}
Ändern Sie schließlich Ihre 'TextView' in XML:
Von: <TextView
An: <com.your_app_goes_here.PerfectScrollableTextView
Versuche dies:
Android:scrollbars = "vertical"
In kotlin, um die Textansicht scrollbar zu machen
myTextView.movementMethod= ScrollingMovementMethod()
und füge diese Eigenschaft auch in xml hinzu
Android:scrollbars = "vertical"
wann immer Sie die ScrollView als übergeordnetes verwenden müssen , Und Sie verwenden auch die Scroll-Verschiebungsmethode mit TextView.
Und wenn Sie Ihr Gerät im Querformat porträtieren, treten zu diesem Zeitpunkt einige Probleme auf . (wie) die gesamte Seite ist scrollbar, aber die Verschiebungsmethode kann nicht funktionieren.
wenn Sie dennoch ScrollView als übergeordnete oder Scroll-Verschiebungsmethode verwenden müssen, verwenden Sie auch unter desc.
Wenn Sie keine Probleme haben, verwenden Sie EditText anstelle von TextView
siehe unten :
<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"/>
Hier verhält sich der EditText wie TextView
Und Ihr Problem wird gelöst
XML - Sie können Android:scrollHorizontally
Attribute verwenden
Gibt an, ob der Text breiter als die Ansicht sein darf (und daher horizontal gescrollt werden kann).
Kann ein boolescher Wert sein, z. B. "true" oder "false".
Prigramacaly - setHorizontallyScrolling(boolean)
Fügen Sie maxLines
und scrollbars
in TextView in XML ein.
<TextView Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:scrollbars="vertical"
Android:maxLines="5" // any number of max line here.
/>
Dann in Java code.
textView.setMovementMethod(new ScrollingMovementMethod());
In meinem Fall.Constraint Layout.AS 2.3.
Code-Implementierung:
YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());
XML:
Android:scrollbars="vertical"
Android:scrollIndicators="right|end"
Ich hatte dieses Problem, als ich TextView
in der ScrollView
verwendete. Diese Lösung hat für mich funktioniert.
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;
}
});