การทำให้ TextView สามารถเลื่อนได้บน Android


771

ฉันกำลังแสดงข้อความในมุมมองข้อความที่ยาวเกินกว่าจะใส่ลงในหน้าจอเดียวได้ ฉันต้องทำให้ TextView ของฉันเลื่อนได้ ฉันจะทำสิ่งนั้นได้อย่างไร

นี่คือรหัส:

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

คำตอบ:


1719

คุณไม่จำเป็นต้องใช้งานScrollViewจริง

เพียงแค่ตั้งค่า

android:scrollbars = "vertical"

คุณสมบัติของคุณTextViewในไฟล์ xml ของโครงร่างของคุณ

จากนั้นใช้:

yourTextView.setMovementMethod(new ScrollingMovementMethod());

ในรหัสของคุณ

บิงโกมันเลื่อน!


96
แต่แน่นอนmaxLinesคุณต้องป้อนหมายเลขโดยพลการ; นี่ไม่ใช่สิ่งที่จะใช้ได้กับทุกขนาดหน้าจอและขนาดแบบอักษรใช่ไหม ฉันคิดว่ามันง่ายกว่าที่จะห่อด้วย a ScrollViewซึ่งหมายความว่าฉันไม่จำเป็นต้องเพิ่มแอตทริบิวต์ XML หรือรหัสเพิ่มเติมอีก (เช่นการตั้งค่าวิธีการเคลื่อนไหว)
Christopher Orr

12
@Christopher, ScrollView ต้องใช้ 'android: layout_height' ด้วย
Regex Rookie

11
@Regex: ใช่ ไม่ว่าคุณScrollViewจะใช้พื้นที่มากเท่าที่ต้องการ (เช่นผ่านแอandroid:fillViewportททริบิวต์) หรือตั้งขนาดเฉพาะที่คุณต้องการ ใช้maxLinesไม่ควรใช้ชุดขนาดขององค์ประกอบ UI เพื่อให้เป็นวิธีการแก้ปัญหาไม่มี
Christopher Orr

62
คุณไม่จำเป็นต้องกำหนด maxlines ส่วนที่เหลือเพียง
Stevanicus

13
เพื่อชี้แจงสิ่งที่ทุกคนพูดเกี่ยวกับการเลื่อน "ราบรื่น": หากคุณใช้วิธีนี้การเลื่อนคือ "ราบรื่น" (ในที่ที่คุณสามารถเลื่อนพิกเซลทีละพิกเซล) แต่มันไม่ได้เป็นพลังงานจลน์ ทันทีที่คุณเอานิ้วออกจะหยุดเลื่อนทันที - ไม่มีการสะบัด นี่เป็นสิ่งที่ยอมรับไม่ได้สำหรับ UI ที่ทันสมัยดังนั้นฉันจะแก้ไขคำตอบเพื่อให้แน่ใจว่าคนอื่นไม่ต้องเสียเวลากับ "วิธีแก้ปัญหา" นี้
Timmmm

310

นี่คือวิธีที่ฉันทำอย่างหมดจดใน 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>

หมายเหตุ:

  1. android:fillViewport="true"รวมกับandroid:layout_weight="1.0"จะทำให้ textview ใช้พื้นที่ว่างทั้งหมด

  2. เมื่อกำหนด Scrollview อย่าระบุandroid:layout_height="fill_parent"มิฉะนั้น scrollview ไม่ทำงาน! (นี่ทำให้ฉันเสียเวลาหนึ่งชั่วโมงตอนนี้! FFS)

เคล็ดลับ PRO:

หากต้องการเลื่อนไปที่ด้านล่างโดยทางโปรแกรมหลังจากต่อท้ายข้อความให้ใช้สิ่งนี้:

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

12
ไม่จำเป็นต้องใช้mTextView.getBottom()เพียงใช้วิธีนี้mScrollView.fullScroll(View.FOCUS_DOWN)เพราะเป็นส่วนหนึ่งของ ScrollView API ดูที่นี่และที่นี่สำหรับข้อมูลเพิ่มเติม
ChuongPham

7
Android เตือนว่าอย่างใดอย่างหนึ่งLinearLayoutหรือScrollViewอาจจะไม่มีประโยชน์ในตัวอย่างนี้ (ฉันออกLinearLayoutอย่างสมบูรณ์) นอกจากนี้ยังเตือนว่าสำหรับTextViewมันควรจะเป็นเพื่อให้ตรงกับandroid:layout_height="wrap_content" ScrollViewคำเตือนเหล่านี้อาจเกิดจาก 3 ปีที่ผ่านไปตั้งแต่คำตอบนี้ถูกโพสต์ คำตอบนี้สนับสนุนการเลื่อนและการสะบัดอย่างราบรื่น ... + 1
skia.heliou

การเพิ่ม<!--suppress AndroidLintUselessParent -->ข้างต้นScrollViewในไฟล์ xml จะดูแลคำเตือนเหล่านั้น
Louie Bertoncin

"เคล็ดลับโปร" ไม่ทำงานสำหรับฉันใน Android API ระดับ 9 มุมมองข้อความยังคงเลื่อนไปด้านบนหลังจากข้อความต่อท้าย
LarsH

วิธีนี้ดีกว่ามากเมื่อใช้วิธีตอบรับที่ยอมรับแล้วจะไม่สร้างประสบการณ์การใช้งานที่ราบรื่น
seyedrezafar

120

สิ่งที่จำเป็นจริงๆคือ setMovementMethod () นี่คือตัวอย่างการใช้ LinearLayout

ไฟล์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>

ไฟล์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);
    }
}

3
มีวิธีการตั้งค่าคุณสมบัตินี้ใน XML หรือไม่? ฉันสงสัยว่าทำไมพวกเขาถึงออกทางเลือกนั้น
Thalur

มันใช้งานได้ แต่เป็นวิธีการรีเฟรชหลังจากเลื่อนหรือไม่? ฉันหมายถึงหลังจากเลื่อน TextView ฉันกำลังจะเปลี่ยนข้อความ แต่ตำแหน่งจะยังคงเลื่อนแม้ว่าจะไม่จำเป็นก็ตาม ก่อนหน้านี้ก่อนหน้านี้ฉันเคยใช้ scroll ...
Nirav Dangi

9
ไม่มีแถบเลื่อนและการเลื่อนเป็น clunky เมื่อเปรียบเทียบกับScrollViewวิธีการ
Jeffrey Blattman

1
ใช้StringBuilderแทนString... สิ่งที่คุณมีอยู่นั้นสิ้นเปลืองเพียงเล็กน้อย
Alex Lockwood

4
ใช้งานได้ แต่การเลื่อนไม่ราบรื่น ยังคงทำงานได้แม้ว่าจะขอบคุณ
frostymarvelous

46

ทำให้มุมมองข้อความของคุณเพิ่งเพิ่มสิ่งนี้

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

16
นี่ไม่ได้เป็นการเลื่อนแบบจลน์ ห้ามใช้สิ่งนี้
Timmmm

3
@ Timmmm วิธีการเลื่อน kinetic?
Ciro Santilli 法轮功病毒审查六四事件法轮功

คุณไม่ต้องการ "kinetic scrolling" สำหรับข้อความที่ต้องอ่าน
เหลือเชื่อ Jan

41

ไม่จำเป็นต้องใส่

android:Maxlines="AN_INTEGER"`

คุณสามารถทำงานได้โดยเพิ่ม:

android:scrollbars = "vertical"

และใส่รหัสนี้ในคลาส Java ของคุณ:

textview.setMovementMethod(new ScrollingMovementMethod());

ทางออกที่ดีกว่าขนาดที่ยอมรับเนื่องจากขนาดแถบเลื่อนตรงกับข้อความและคุณไม่ต้องเสียพื้นที่
FractalBob

เมื่อฉันใช้ ScrollView ในฐานะผู้ปกครองเวลานั้นมันไม่ทำงาน
Prince

27

คุณสามารถ

  1. ล้อมรอบTextViewด้วย a ScrollView; หรือ
  2. ScrollingMovementMethod.getInstance();กำหนดวิธีการเคลื่อนไหว

22

วิธีที่ดีที่สุดที่ฉันพบ:

แทนที่ TextView ด้วย EditText ด้วยคุณสมบัติพิเศษเหล่านี้:

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

ไม่จำเป็นต้องห่อใน ScrollView


2
คำตอบที่ดีที่สุดและเหมาะสมที่สุดได้อย่างง่ายดายโดยเฉพาะอย่างยิ่งการพิจารณาว่า EditText เป็นคลาสย่อยของ TextView และคำถามคือวิธีทำให้ textview เลื่อนได้ไม่ใช่วิธีแก้ไขปัญหา จะลงคะแนนถึงสองครั้งถ้าฉันสามารถ :)
จัสติน Buser

4
@JustinBuser ไม่เห็นด้วยอีกต่อไป :) มันเป็นเรื่องบังเอิญอย่างยิ่งที่ใช้งานได้และไม่มีการรับประกันว่ามันจะใช้งานได้ใน Android รุ่นอนาคต หากคุณต้องการเลื่อนให้ใช้เครื่องมือเลื่อนที่ Android จัดไว้ให้ ScrollViewเป็นวิธีที่ถูกต้องที่จะไป
Madbreaks

1
@Madbreaks ไม่มีอะไร "serendipitous" เกี่ยวกับมัน EditText IS TextView ด้วยวิธีการที่เพิ่มเข้ามาไม่กี่และการแทนที่ที่ปรับแต่งเป็นพิเศษเพื่อรองรับข้อความความยาวที่แตกต่างกัน โดยเฉพาะอย่างยิ่ง EditText จะแทนที่ค่าที่ส่งคืนสำหรับฟังก์ชัน TextView getDefaultMovementMethod การใช้งานเริ่มต้นส่งกลับค่า NULL โดยทั่วไป EditText ทำสิ่งเดียวกันทั้งหมดคำตอบอื่น ๆ เหล่านี้จะแนะนำ เท่าที่มีการใช้เครื่องมือที่ Android จัดเตรียมไว้แล้วคลาส EditText นั้นมีแนวโน้มที่จะถูกคัดค้านน้อยกว่าวิธีอื่นใดที่พบในคำตอบเหล่านี้
Justin Buser

4
@JustinBuser ปัญหาของฉันคือแม้ว่าคุณจะขึ้นอยู่กับพฤติกรรมเริ่มต้นของ EditText นั่นคือสิ่งที่ฉันหมายถึงอาจเปลี่ยนไปตามถนนได้เป็นอย่างดี (ไม่ใช่ทั้งหมดที่ EditText จะเลิกใช้) คุณสามารถโต้แย้งได้ว่าความคิดนี้คือการใช้ส่วนประกอบและคุณสมบัติที่เหมาะสมกับงานในมือ ScrollView ได้รับการออกแบบอย่างชัดเจนเพื่อให้ครอบคลุมการเลื่อน ฉันพยายามและแนะนำให้คนอื่นใช้เครื่องมือที่เหมาะสมกับงานเสมอ มีหลายวิธีในการแก้ปัญหาการเขียนโปรแกรม อย่างไรก็ตามขอขอบคุณสำหรับการตอบสนองอย่างรอบคอบ
Madbreaks

16

ง่าย นี่คือวิธีที่ฉันทำ:

  1. ด้าน 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:

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

โบนัส:

หากต้องการให้มุมมองข้อความเลื่อนลงมาในขณะที่เติมข้อความคุณต้องเพิ่ม:

    android:gravity="bottom"

ไปยังไฟล์ TextView xml มันจะเลื่อนลงโดยอัตโนมัติเมื่อมีข้อความเข้ามามากขึ้น

แน่นอนคุณต้องเพิ่มข้อความโดยใช้ฟังก์ชั่นผนวกแทนชุดข้อความ:

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

ฉันใช้มันเพื่อวัตถุประสงค์ในการบันทึก

ฉันหวังว่านี่จะช่วยได้ ;)


14

นี่คือ "วิธีการใช้แถบเลื่อนกับ TextView ของคุณ" โดยใช้ XML เท่านั้น

ก่อนอื่นคุณต้องใช้ตัวควบคุม Textview ในไฟล์main.xmlและเขียนข้อความลงไป ... แบบนี้:

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

จากนั้นวางตัวควบคุมมุมมองข้อความไว้ระหว่างแถบเลื่อนเพื่อแสดงแถบเลื่อนสำหรับข้อความนี้:

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

แค่นั้นแหละ...


6
ทำไมถึงต้องเขียนเรื่องนี้? นี่เป็นคำตอบที่เกือบเหมือนกัน แต่ถูกต้องน้อยกว่าซึ่งเป็นคำตอบที่โพสต์ในช่วง 6 เดือนก่อนที่คุณจะเขียน
Justin Buser

11

สิ่งนี้จะให้ข้อความการเลื่อนที่ราบรื่นพร้อมแถบเลื่อน

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

เปิดใช้งานภาพเคลื่อนไหวสีน้ำเงิน คำตอบที่ดีที่สุดที่นี่ IMO
Griffin W.

11

"การโปรปลาย" ด้านบนจากบางคน ( การเลื่อน TextView บน Android ) ใช้งานได้ดี แต่สิ่งที่ถ้าคุณกำลังแบบไดนามิกเพิ่มข้อความไป ScrollView และต้องการโดยอัตโนมัติเลื่อนไปด้านล่างหลังจากนั้นผนวกเฉพาะเมื่อผู้ใช้อยู่ที่ ด้านล่างของ ScrollView (อาจเป็นเพราะหากผู้ใช้เลื่อนขึ้นเพื่ออ่านสิ่งที่คุณไม่ต้องการรีเซ็ตโดยอัตโนมัติที่ด้านล่างระหว่างการผนวกซึ่งจะน่ารำคาญ)

อย่างไรก็ตามนี่คือ:

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

mTextStatus.getLineHeight () จะทำให้มันเพื่อให้คุณไม่ scrollToBottom () ถ้าผู้ใช้อยู่ภายในหนึ่งบรรทัดจากปลาย ScrollView


10

หากคุณต้องการเลื่อนข้อความภายในมุมมองข้อความคุณสามารถทำตามดังต่อไปนี้:

ก่อนอื่นคุณควรจะต้อง subclass textview

แล้วใช้มัน

ต่อไปนี้เป็นตัวอย่างของ textview ที่ subclassed

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

ตอนนี้คุณต้องใช้สิ่งนั้นใน XML ด้วยวิธีนี้:

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

แค่นั้นแหละ.


7

เพิ่มสิ่งต่อไปนี้ใน textview ใน XML

android:scrollbars="vertical"

และสุดท้ายเพิ่ม

textView.setMovementMethod(new ScrollingMovementMethod());

ในไฟล์ Java


1
นี่ไม่ได้เป็นการเลื่อนแบบจลน์ อย่าใช้มัน
Timmmm

6

ฉันไม่พบการเลื่อนข้อความของ TextView เพื่อรองรับท่าทาง 'การเหวี่ยง' ซึ่งจะเลื่อนไปเรื่อย ๆ หลังจากเลื่อนขึ้นหรือลง ฉันลงเอยด้วยการใช้งานตัวเองเพราะฉันไม่ต้องการใช้ ScrollView ด้วยเหตุผลหลายประการและดูเหมือนจะไม่เป็น MovementMethod ที่ทั้งคู่อนุญาตให้ฉันเลือกข้อความและคลิกที่ลิงก์


6
ดังนั้น ... คุณเพิ่มท่าทางการพุ่งได้อย่างไร?
Lou Morda

6

ใน kotlin สำหรับการทำ textview scrollable

myTextView.movementMethod= ScrollingMovementMethod()

และเพิ่มคุณสมบัตินี้ด้วย xml

    android:scrollbars = "vertical"

5

เมื่อคุณเลื่อนได้เสร็จแล้วให้เพิ่มบรรทัดนี้ในบรรทัดสุดท้ายของมุมมองเมื่อคุณป้อนอะไรก็ได้ในมุมมอง:

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

เพื่อน tablescroller เป็นมุมมองที่ถูกระบุโดยคุณลักษณะ id จาก XML ที่ถูกประมวลผลค่ะ .. แค่ลอง .. มันจะทำงานได้ดี .. มันทำงานฉัน ..
Rahul Baradia

4

หากคุณไม่ต้องการใช้โซลูชัน EditText คุณอาจโชคดีกว่าด้วย:

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

4

เพิ่มลงในเค้าโครง 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"

และในโค้ดคุณต้องเขียนบรรทัดต่อไปนี้:

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

2
นี่ไม่ได้เป็นการเลื่อนแบบจลน์ อย่าใช้มัน
Timmmm

ฉันไม่ต้องการที่จะทำเครื่องหมายจุดสิ้นสุดข้อความ ฉันต้องทำอย่างไร.
Sagar Nayak

@SagarNayak ใช้ android: ellipsize = "none"
ฟรานซิส

2

โค้ดด้านล่างสร้าง textview การเลื่อนแนวนอนอัตโนมัติ:

ในขณะที่เพิ่ม TextView ให้กับการใช้ xml

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

ตั้งค่าคุณสมบัติต่อไปนี้ของ TextView ใน onCreate ()

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


1

ใช้มันแบบนี้

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

0

ในกรณีของฉันข้อ จำกัด เค้าโครงเป็น 2.3

การติดตั้งโค้ด:

YOUR_TEXTVIEW.setMovementMethod(new ScrollingMovementMethod());

XML:

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

0

ฉันดิ้นรนกับสิ่งนี้มานานกว่าหนึ่งสัปดาห์และในที่สุดก็หาวิธีที่จะทำให้งานนี้!

ปัญหาของฉันคือทุกอย่างจะเลื่อนเป็น 'บล็อก' ข้อความตัวเองกำลังเลื่อน แต่ในฐานะที่เป็นชิ้นมากกว่าทีละบรรทัด เห็นได้ชัดว่ามันไม่ได้ผลสำหรับฉันเพราะมันจะตัดเส้นที่ด้านล่าง โซลูชันก่อนหน้าทั้งหมดไม่ได้ผลสำหรับฉันดังนั้นฉันจึงสร้างขึ้นมาเอง

นี่คือทางออกที่ง่ายที่สุดโดยไกล:

สร้างไฟล์คลาสที่ชื่อว่า: 'PerfectScrollableTextView' ภายในแพ็คเกจจากนั้นคัดลอกและวางรหัสนี้ใน:

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

สุดท้ายเปลี่ยน 'TextView' ใน XML:

จาก: <TextView

ถึง: <com.your_app_goes_here.PerfectScrollableTextView


1
คำตอบที่สมบูรณ์แบบ 100% ฉันประสบปัญหาเดียวกับที่คุณพูดถึงในคำอธิบาย ใช้โซลูชันจำนวนมาก แต่ไม่ทำงานอย่างสมบูรณ์ แต่โซลูชันของคุณทำงานได้อย่างสมบูรณ์แบบในทุกกรณี ประหยัดเวลาของฉันคน :) ขอบคุณ
Daxesh Vekariya

@DaxeshVekariya ดีใจที่มันใช้ได้ผลสำหรับคุณ!
Petro

0

ใส่maxLinesและscrollbarsข้างใน TextView ใน xml

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

จากนั้นในโค้ดจาวา

textView.setMovementMethod(new ScrollingMovementMethod());


0

ฉันมีปัญหานี้เมื่อฉันถูกใช้ภายในTextView ScrollViewวิธีนี้ใช้ได้ผลสำหรับฉัน

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

0

ทุกครั้งที่คุณต้องการใช้ ScrollView เป็นพาเรนต์ต์และคุณยังใช้วิธีการเลื่อนด้วย TextView

และเมื่อคุณถ่ายภาพแนวนอนเพื่อให้อุปกรณ์ของคุณในเวลานั้นเกิดปัญหาขึ้นขึ้น (เหมือน) ทั้งหน้าสามารถเลื่อนได้ แต่วิธีการเลื่อนดูไม่สามารถใช้งานได้

หากคุณยังจำเป็นต้องใช้ ScrollView เป็นวิธีหลักหรือการเคลื่อนไหวแบบเลื่อนคุณจะต้องใช้ปุ่มล่างสุด

หากคุณไม่มีปัญหาใด ๆ ให้ใช้ EditText แทน TextView

ดูด้านล่าง:

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

ที่นี่ EditText จะทำงานเหมือนกับ TextView

และปัญหาของคุณจะได้รับการแก้ไข


0

XML - คุณสามารถใช้android:scrollHorizontallyคุณสมบัติ

ไม่ว่าจะเป็นข้อความที่ได้รับอนุญาตให้กว้างกว่ามุมมอง (และสามารถเลื่อนในแนวนอน)

อาจเป็นค่าบูลีนเช่น "true" หรือ "false"

Prigramacaly - setHorizontallyScrolling(boolean)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.