วิธีตัดข้อความใน textview ใน Android


86

มีใครรู้วิธีตัดข้อความใน TextView ในแพลตฟอร์ม Android กล่าวคือหากข้อความใน textview ยาวเกินความยาวของหน้าจอก็ควรจะแสดงในบรรทัดที่สอง

ฉันได้ค้นหาและลองสิ่งต่อไปนี้:

android:scrollHorizontally="false",
android:inputType="textMultiLine",
android:singleLine="false"

แต่ไม่มีผลงาน ..

ใครช่วยแนะนำวิธีทำได้


7
TextViews ควรตัดคำตามค่าเริ่มต้น คุณสามารถโพสต์เค้าโครงทั้งหมดของคุณได้หรือไม่
danh32

Textview อยู่ในเค้าโครงตารางโดยบังเอิญหรือไม่ ถ้าอย่างนั้นฉันมีคำตอบให้คุณ
JohnFx

1
ในกรณีของฉันหลังจากที่เพิ่มประมาณครึ่งโหลแอตทริบิวต์ (อธิบายด้านล่าง) เพื่อบังคับให้ TextView android:inputType="textPersonName"กับข้อความห่อมากกว่าหลายบรรทัดไม่ประสบความสำเร็จผมสังเกตเห็นฉันมีแอตทริบิวต์ เห็นได้ชัดว่ามีการเพิ่มเครื่องมือออกแบบ Android Studio การลบแอตทริบิวต์นั้นช่วยแก้ปัญหาได้! อาจมีอินพุตประเภทอื่นที่ป้องกันการห่อด้วย
LarsH

คำตอบ:


57

สำหรับฉันปัญหานี้เกิดขึ้นเฉพาะบน Android <4.0

การรวมกันของพารามิเตอร์ที่ฉันใช้คือ:

android:layout_weight="1"
android:ellipsize="none"
android:maxLines="100"
android:scrollHorizontally="false"

จำนวน maxLines ดูเหมือนจะเป็นชิ้นส่วนสุดท้ายแบบสุ่มที่ทำให้ TextView ของฉันถูกตัดออก


9
ตอนนี้ฉันรู้ว่าเป็นกระทู้เก่า แต่คิดว่าจะโพสต์สิ่งที่ค้นพบ ฉันใช้เฉพาะ 'android: maxLines' แล้วมันก็ห่อข้อความของฉัน Cheer @Guykun
StuStirling

อีกครั้งนี่เป็นเพียงการตั้งค่าความสูงของ TextView เป็นmatch_parentซึ่งไม่เหมือนกับการทำให้ความสูงของ TextView ขยายเพื่อรวมบรรทัดพิเศษ
SMBiggs

51

เค้าโครงข้อ จำกัด

<TextView
android:id="@+id/some_textview"
android:layout_width="0dp"
android:layout_height="wrap_content"

app:layout_constraintLeft_toLeftOf="@id/textview_above"
app:layout_constraintRight_toLeftOf="@id/button_to_right"/>
  • ตรวจสอบความกว้างของเค้าโครงของคุณเป็นศูนย์
  • มีการกำหนดข้อ จำกัด ด้านซ้าย / ขวา
  • ความสูงของโครงร่างของ wrap_content อนุญาตให้ขยายขึ้น / ลง
  • ตั้งค่าandroid:maxLines="2"เพื่อป้องกันการขยายตัวในแนวตั้ง (2 เป็นเพียงตัวอย่าง)
  • วงรีคือพร็อบ เป็นความคิดที่ดีกับ max linesandroid:ellipsize="end"

ความกว้าง 0dp อนุญาตให้มีข้อ จำกัด ด้านซ้าย / ขวาเพื่อกำหนดว่าวิดเจ็ตของคุณกว้างแค่ไหน

การตั้งค่าข้อ จำกัด ด้านซ้าย / ขวาจะกำหนดความกว้างจริงของวิดเจ็ตของคุณซึ่งข้อความของคุณจะรวมอยู่ในนั้น

เอกสารเค้าโครงข้อ จำกัด


ใช่ นี่คือวิธีการทำงาน! ตรวจสอบให้แน่ใจว่าคุณตั้งค่าความกว้างเป็น 0dp
Yoraco Gonzales

การตั้งค่าข้อ จำกัด ด้านซ้ายและด้านขวาช่วยให้ครอบคลุมสำหรับฉันแทนที่จะเป็นข้อความที่ล้นเกินขอบเขตด้านขวา
Jia Tse

31

สำหรับกรณีที่TextViewอยู่ภายใน a TableLayoutวิธีแก้ปัญหาคือการตั้งค่าandroid:shrinkColumns="1"บนTableLayout. (แทนที่1ด้วยหมายเลขคอลัมน์ที่ TextView ที่คุณต้องการตัดอยู่ (ดัชนี 0))

AFAICT ไม่จำเป็นต้องมีแอตทริบิวต์อื่น ๆ ในไฟล์TextView.

สำหรับกรณีอื่น ๆ โปรดดูคำตอบอื่น ๆ ที่นี่

FWIW ตอนแรกฉันได้รับมันเพื่อทำงานร่วมกับ

 <TextView
   android:id="@+id/inventory_text"
   android:layout_width="fill_parent"
   android:layout_weight="1"
   android:width="0dp"

แต่นั่นส่งผลให้มีพื้นที่ว่างเพิ่มเติมที่ด้านล่างของกล่องโต้ตอบซึ่งทั้งหมดอยู่ในนั้น


นี่คือสิ่งที่ฉันกำลังมองหา! มิฉะนั้นคำพูดของฉันจะถูกตัดออก
Carson Holzheimer

12

คุณต้องใช้ 2 พารามิเตอร์:

  • android:ellipsize="none" : ข้อความไม่ถูกตัดตามความกว้างของ textview

  • android:scrollHorizontally="false" ข้อความจะตัดเป็นบรรทัดมากเท่าที่จำเป็น


5
นั่นไม่ได้ผลสำหรับฉัน (FWIW ฉันมี TextView ใน TableRow ใน TableLayout)
aij

8

ใช้app:breakStrategy="simple"ในAppCompatTextViewก็จะสามารถควบคุมรูปแบบวรรค

มีค่าคงที่สามค่า

  • สมดุล
  • คุณภาพสูง
  • เรียบง่าย

การออกแบบใน TextView xml ของคุณ

<android.support.v7.widget.AppCompatTextView
        android:id="@+id/textquestion"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:scrollHorizontally="false"
        android:text="Your Question Display Hear....Your Question Display Hear....Your Question Display Hear....Your Question Display Hear...."
        android:textColor="@android:color/black"
        android:textSize="20sp"
        android:textStyle="bold"
        app:breakStrategy="simple" />

หากระดับ api ต่ำสุดในปัจจุบันของคุณคือ 23 หรือมากกว่านั้นใน Coding

yourtextview.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);

สำหรับการอ้างอิงเพิ่มเติมโปรดดูBreakStrategyนี้

Textview break ภาพยุทธศาสตร์


7

android:layout_weight="1"นี้ควรจะแก้ไขปัญหาของคุณ:


เพียงแค่นี้ก็ทำให้เกิด TextView match_parentเพื่อขยายที่จะใช้เป็นพื้นที่มากที่สุดเท่าที่เป็นไปได้ซึ่งเป็นเช่นเดียวกับการตั้งค่าความสูงที่จะ ไม่ค่อยตรงกับที่ OP ต้องการ
SMBiggs

1
ในกรณีของ TableLayout layout_weight="1"แก้ไขปัญหาให้ฉัน อย่างไรก็ตาม TableRow ของฉันที่มี TextView ได้layout_heightตั้งค่าเป็นค่าเฉพาะ อาจจะมีประโยชน์สำหรับใครบางคน
kit

5

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

  1. . ตั้งค่าโหมดสปินเนอร์ของคุณ (ผู้ปกครอง) เช่น:

    android:spinnerMode="dialog"  
    
  2. ตั้งค่าคุณสมบัติของ textview (มุมมองแบบกำหนดเองของเด็ก) เป็น:

    android:layout_weight="1"  
    android:ellipsize="none"  
    android:maxLines="100"  
    android:scrollHorizontally="false"
    

ฉันหวังว่านี่จะเหมาะกับคุณเช่นกัน


พยายามหลายสิ่งหลายอย่างเพื่อให้มันทำงานในโหมด 'ดรอปดาวน์' แต่ไม่ได้ผล ตอนนี้ตัดสินในโหมด 'โต้ตอบ'
Mangesh

4

โดยการตั้งค่าandroid:maxEmsเป็นค่าที่กำหนดพร้อมกับandroid:layout_weight="1"จะทำให้ TextView ห่อเมื่อถึงความยาวที่กำหนดของ ems


ใช้งานได้กับ TextView ที่วางไว้ใน RelativeLayout ด้วย
ayz4sci

ค้นหามาหลายชั่วโมงแล้วขอบคุณที่ใช้งานได้ดีกับ constraintLayout ด้วย
TarekB

3

ในสตูดิโอของ Android 2.2.3 ภายใต้คุณสมบัติที่มีคุณสมบัติที่เรียกว่าinputType textMultiLineการเลือกตัวเลือกนี้ช่วยแก้ปัญหาที่คล้ายกันสำหรับฉัน ฉันหวังว่าจะช่วยได้


2
สำหรับ EditText ไม่ใช่ Textview
PsychedelicSubstance

2

เพิ่งทำงานกับ TextView ภายในเค้าโครงภายใน RecyclerView ฉันมีข้อความการปิดตัดอดีตสำหรับผมเห็น:Read this message Read thisฉันลองตั้งค่าandroid:maxLines="2"บน TextView แล้ว แต่ไม่มีอะไรเปลี่ยนแปลง อย่างไรก็ตามandroid:lines="2"ส่งผลให้ในRead thisบรรทัดแรกและmessageในบรรทัดที่ 2


1

ผมมีปัญหาเดียวกัน. หลังจากการเปลี่ยนแปลงทำให้มันใช้งานได้ -

android:layout_width="wrap_content"

จุดไข่ปลา maxLines หรือ layout_weight ทั้งหมดไม่ได้สร้างความแตกต่างใด ๆ หมายเหตุ - ยังกำหนดความกว้างหลักเป็น wrap_content


1

สิ่งที่คุณต้องทำคือกำหนดความกว้างของการดูข้อความ

android: layout_width = "60dp"

คุณสามารถเปลี่ยนความกว้างได้ตามต้องการ เพียงพิมพ์ประโยคยาว ๆ เพื่อตรวจสอบว่าทำงานเช่นนี้หรือไม่

android: text = "ฉันอยากเป็นหนึ่งในวิศวกรซอฟต์แวร์ระดับโลก"


1

ลองแนวทางของ @ กายกุล

android:layout_weight="1" android:ellipsize="none" android:maxLines="100" android:scrollHorizontally="false"

ตรวจสอบให้แน่ใจว่าไม่ได้ตั้งค่าความกว้างของผู้ปกครองเพื่อตัดเนื้อหา นี่คือสิ่งที่ฉันขาดหายไป


0

ฉันใช้ Android 2.2 และ textview ของฉันจะไปที่บรรทัดถัดไปโดยอัตโนมัติหากเกินหน้าจอ

หากคุณต้องการให้ข้อความไปที่บรรทัดถัดไปก่อนสิ้นสุดหน้าจอให้เพิ่มเข้าไป (ใส่ค่า dp ของคุณเอง) สิ่งนี้จะเป็นประโยชน์หากคุณมีรูปภาพทางด้านขวาของข้อความ

android:layout_marginRight="52dp"

0

แปลกมาก - ฉันสร้าง TextView ของฉันใน Code และมันถูกห่อไว้ - แม้ว่าฉันจะไม่ได้ตั้งค่าอะไรเลยนอกจากสิ่งมาตรฐาน - แต่ดูด้วยตัวคุณเอง

LinearLayout.LayoutParams childParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);
childParams.setMargins(5, 5, 5, 5);

Label label = new Label(this);
label.setText("This is a testing label This is a testing label This is a testing label This is a testing labelThis is a testing label This is a testing label");
label.setLayoutParams(childParams);

ดังที่คุณเห็นจากนิยามพารามิเตอร์ที่ฉันใช้ LinearLayout ป้ายชื่อคลาสจะขยาย TextView - ไม่ได้ทำอะไรเลยนอกจากตั้งค่าขนาดตัวอักษรและสีตัวอักษร

เมื่อเรียกใช้ในโปรแกรมจำลอง (API ระดับ 9) มันจะตัดข้อความเป็น 3 บรรทัดโดยอัตโนมัติ


สังเกตการใช้รหัสLinearLayout.LayoutParams childParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);นี้ เป็นไปได้มากว่าการห่อที่คุณคิดว่าเป็นแบบ "อัตโนมัติ"
nemesisfixx

0

เพียงแค่กำหนดlayout_withขนาดที่แน่นอนเมื่อข้อความเต็มความกว้างสูงสุดมันจะล้นไปยังบรรทัดถัดไปทำให้เกิดเอฟเฟกต์การตัด

<TextView
    android:id="@+id/segmentText"
    android:layout_marginTop="10dp"
    android:layout_below="@+id/segmentHeader"
    android:text="You have the option to record in one go or segments(if you swap options 
    you will loose your current recordings)"
    android:layout_width="300dp"
    android:layout_height="wrap_content"/>

0

เคล็ดลับคือด้วยความกว้างของ textView พยายามทำให้เป็นตัวเลขเฉพาะเช่น:

<TextView
    android:layout_width="300dp"
    android:layout_height="wrap_content"/>

ฉันได้ลองวิธีแก้ปัญหามากมายโดยไม่มีผลลัพธ์ใด ๆ ฉันได้ลอง:

    android:ellipsize="none"
    android:scrollHorizontally="false"

สิ่งเดียวที่เรียกใช้ตัวเลือกการตัดคือความกว้างเฉพาะ


-1

คุณต้องเพิ่ม TextView ของคุณใน ScrollView ด้วยสิ่งนี้:

<ScrollView android:id="@+id/SCROLL_VIEW"  
android:layout_height="150px"   
android:layout_width="fill_parent">  

<TextView   
   android:id="@+id/TEXT_VIEW"   
   android:layout_height="wrap_content"   
   android:layout_width="wrap_content"   
   android:text="This text view should act as header This text view should act as header This text view should act as header This text view should act as header This text view should act as header This text view should act as header This text view should act as header" />  
 </ScrollView>

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