Cách bọc văn bản trong textview trong Android


86

Có ai biết cách quấn văn bản trong TextView trong nền tảng Android. tức là nếu văn bản trong textview vượt quá độ dài màn hình, nó sẽ được hiển thị ở dòng thứ hai.

Tôi đã tìm kiếm và thử những cách sau:

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

Nhưng không có tác dụng ..

Bất cứ ai có thể đề nghị làm thế nào tôi có thể làm điều đó.


7
TextViews sẽ được gói từ theo mặc định. Bạn có thể đăng toàn bộ bố cục của bạn?
danh32

Có phải Textview nằm trong một bố cục bảng không? Nếu vậy tôi có câu trả lời cho bạn.
JohnFx

1
Trong trường hợp của tôi, sau khi thêm khoảng nửa tá thuộc tính (được mô tả bên dưới) để buộc chế độ xem văn bản bọc văn bản qua nhiều dòng, nhưng không thành công, tôi nhận thấy rằng mình đã có một thuộc tính android:inputType="textPersonName". Rõ ràng nó đã được thêm vào bởi công cụ thiết kế Android Studio. Xóa thuộc tính đó đã khắc phục sự cố! Có thể có các loại đầu vào khác ngăn quá trình gói.
LarsH

Câu trả lời:


55

Đối với tôi, sự cố này chỉ xảy ra trên Android <4.0

Sự kết hợp của các tham số tôi đã sử dụng là:

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

Số lượng dòng max dường như là phần cuối cùng ngẫu nhiên tạo nên TextView của tôi.


9
Bây giờ tôi biết nó là một chủ đề cũ nhưng tôi nghĩ tôi sẽ đăng những phát hiện của mình. Tôi chỉ sử dụng 'android: maxLines' và sau đó nó bao bọc văn bản của tôi. Cổ vũ @Guykun
StuStirling 10/10/12

Một lần nữa, điều này tương đương với việc chỉ cần đặt chiều cao của TextView thành match_parent, điều này không giống với việc mở rộng chiều cao của TextView để bao gồm các dòng thừa.
SMBiggs

50

Bố cục Ràng buộc

<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"/>
  • Đảm bảo chiều rộng bố cục của bạn bằng 0
  • các ràng buộc trái / phải được xác định
  • chiều cao bố trí của wrap_content cho phép mở rộng lên / xuống.
  • Đặt android:maxLines="2"để ngăn mở rộng theo chiều dọc (2 chỉ là một ví dụ)
  • Dấu ba chấm là dấu chấm. một ý tưởng hay với dòng tối đaandroid:ellipsize="end"

Chiều rộng 0dp cho phép các ràng buộc trái / phải xác định độ rộng của tiện ích con của bạn.

Đặt ràng buộc trái / phải sẽ đặt chiều rộng thực của tiện ích con của bạn, trong đó văn bản của bạn sẽ bao bọc.

Tài liệu về bố cục ràng buộc


Đúng! Đây chính xác là cách nó hoạt động! Chỉ cần chắc chắn rằng bạn thiết lập chiều rộng để 0dp
Yoraco Gonzales

thiết lập các ràng buộc bên trái và bên phải đã giúp làm cho nó trở nên cuốn hút đối với tôi, thay vì văn bản tràn ra ngoài giới hạn bên phải
Jia Tse

31

Đối với trường hợp TextViewbên trong a TableLayout, giải pháp là đặt android:shrinkColumns="1"trên TableLayout. (Thay thế 1bằng số cột mà TextView bạn muốn đưa vào. (0-indexed))

AFAICT, không cần thuộc tính nào khác trên TextView.

Đối với các trường hợp khác, hãy xem các câu trả lời khác tại đây.

FWIW, ban đầu tôi đã hiểu nó về công việc

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

nhưng điều đó dẫn đến một số không gian trống thừa ở cuối Hộp thoại mà tất cả đều nằm trong đó.


Đây là những gì tôi đang tìm kiếm! Nếu lời nói của tôi bị cắt đứt
Carson Holzheimer

12

Bạn phải sử dụng 2 tham số:

  • android:ellipsize="none" : văn bản không bị cắt trên chiều rộng textview

  • android:scrollHorizontally="false" văn bản bao nhiêu dòng nếu cần


5
Điều đó không hiệu quả với tôi. (FWIW, tôi có một TextView trong một TableRow trong một TableLayout.)
aij

8

Sử dụng app:breakStrategy="simple"trong AppCompatTextView, nó sẽ kiểm soát bố cục đoạn văn.

Nó có ba giá trị không đổi

  • cân bằng
  • chất lượng cao
  • đơn giản

Thiết kế trong xml TextView của bạn

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

Nếu mức api tối thiểu hiện tại của bạn là 23 trở lên thì trong Mã hóa

yourtextview.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);

Để biết thêm thông tin tham khảo, hãy tham khảo BreakStrategy này

Ngắt chế độ xem văn bản


7

Điều này sẽ khắc phục vấn đề của bạn: android:layout_weight="1".


Điều này chỉ khiến TextView mở rộng để chiếm nhiều không gian nhất có thể, giống như đặt Chiều cao thành match_parent. Không hoàn toàn giống như OP muốn.
SMBiggs

1
Trong trường hợp của TableLayout, layout_weight="1" khắc phục sự cố cho tôi. Tuy nhiên, TableRow của tôi có chứa TextView, đã được layout_heightđặt thành một giá trị cụ thể. Có thể sẽ hữu ích cho một ai đó
kit

5

OK các bạn, sự thật nằm ở đâu đó ở giữa vì bạn phải nhìn vấn đề từ quan điểm của cha mẹ và con cái. Giải pháp bên dưới CHỈ hoạt động khi chế độ quay vòng = dialogbất kể phiên bản Android nào (không có vấn đề gì ở đó .. đã thử nghiệm nó trong VD và DesireS với Android => 2.2):

  1. . Đặt chế độ quay của bạn (cha mẹ) như:

    android:spinnerMode="dialog"  
    
  2. Đặt thuộc tính của textview (chế độ xem tùy chỉnh con) thành:

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

Tôi hy vọng điều này cũng làm việc cho bạn.


Đã thử rất nhiều thứ để làm cho nó hoạt động ở chế độ 'thả xuống' nhưng không có kết quả. Bây giờ đã ổn định ở chế độ 'hộp thoại'.
Mangesh

4

Bằng cách đặt android:maxEmsthành một giá trị nhất định cùng với android:layout_weight="1"sẽ làm cho TextView kết thúc khi nó đạt đến độ dài nhất định của ems.


Cũng hoạt động cho TextView được đặt trong RelativeLayout.
ayz4sci 23/03/18

đã tìm kiếm trong nhiều giờ, cảm ơn vì nó cũng hoạt động tốt trên cả
bindLayout

3

Trong Android Studio 2.2.3 bên dưới thuộc inputTypetính có một thuộc tính được gọi là textMultiLine. Chọn tùy chọn này đã giải quyết một vấn đề tương tự cho tôi. Tôi hy vọng rằng sẽ giúp.


2
Này là dành cho EditText, không TextView
PsychedelicSubstance

2

Chỉ đang làm việc trên TextView bên trong bố cục bên trong RecyclerView. Tôi đã văn bản bị cắt đứt, ex, cho Read this message, tôi thấy: Read this. Tôi đã thử cài đặt android:maxLines="2"trên TextView, nhưng không có gì thay đổi. Tuy nhiên, android:lines="2"kết quả là ở Read thisdòng đầu tiên và messageở dòng thứ 2.


1

Tôi đã từng gặp vấn đề tương tự. Thay đổi sau đã làm cho nó hoạt động -

android:layout_width="wrap_content"

Dấu chấm lửng, maxLines hoặc layout_weight - tất cả đều không tạo ra sự khác biệt nào. Lưu ý - Chiều rộng mẹ cũng được đặt là wrap_content.


1

Tất cả những gì bạn phải làm là đặt chiều rộng chế độ xem văn bản của mình .

android: layout_width = "60dp"

bạn có thể thay đổi chiều rộng theo lựa chọn của bạn. Chỉ cần nhập câu dài để kiểm tra xem nó có hoạt động như thế này không

android: text = "tôi muốn trở thành một kỹ sư phần mềm đẳng cấp thế giới"


1

Hãy thử cách tiếp cận của @ Guykun

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

Ngoài ra, hãy đảm bảo rằng chiều rộng của cha mẹ không được đặt để bao bọc nội dung. Đây là điều mà tôi đã thiếu.


0

Tôi đang sử dụng Android 2.2 và chế độ xem văn bản của tôi sẽ tự động chuyển sang dòng tiếp theo nếu nó vượt quá màn hình.

Nếu bạn muốn có văn bản ở dòng tiếp theo trước khi kết thúc màn hình, chỉ cần thêm vào (chỉ cần đặt giá trị dp của riêng bạn). Điều này sẽ hữu ích nếu bạn có một hình ảnh ở bên phải văn bản.

android:layout_marginRight="52dp"

0

Thật kỳ lạ - tôi đã tạo TextView của mình trong Code và nó được bao bọc - mặc dù tôi không thiết lập bất kỳ thứ gì ngoại trừ những thứ tiêu chuẩn - nhưng hãy tự xem:

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

Như bạn có thể thấy từ định nghĩa tham số, tôi đang sử dụng LinearLayout. Lớp Nhãn chỉ đơn giản là mở rộng TextView - không làm bất cứ điều gì ở đó ngoại trừ việc thiết lập kích thước phông chữ và màu phông chữ.

Khi chạy nó trong trình giả lập (API Cấp 9), nó sẽ tự động bao bọc văn bản trên 3 dòng.


Lưu ý việc sử dụng mã này LinearLayout.LayoutParams childParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);. Nhiều khả năng mà các gói mà bạn xem là "automagic"
nemesisfixx

0

Chỉ cần đặt thành layout_withkích thước làm mờ, khi văn bản lấp đầy chiều rộng tối đa, nó sẽ tràn sang dòng tiếp theo gây ra hiệu ứng bọc.

<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

Bí quyết là với chiều rộng textView, hãy thử đặt nó là số dành riêng như:

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

Tôi đã thử nhiều giải pháp mà không có kết quả, tôi đã thử:

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

một điều duy nhất làm sai tùy chọn bọc là chiều rộng chuyên dụng


-1

Bạn cần thêm TextView của mình vào ScrollView với một cái gì đó như sau:

<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
Cảm ơn bạn đã trả lời Nhưng mục đích của tôi là cuộn văn bản khi nó vượt quá độ dài dòng chứ không phải để cuộn ngang.
Sameer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.