Văn bản TextView trên Android không bị quấn


77

Bất cứ ai có thể cho tôi biết điều gì đang xảy ra với văn bản? Văn bản dài hơn một dòng không nằm ở dòng tiếp theo mà vượt ra ngoài màn hình.

Sau đây là mã:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:padding="4dip">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:padding="4dip">

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:orientation="horizontal" 
            android:padding="4dip">
            <TextView 
                android:id="@+id/reviewItemEntityName"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:text="event/venue" 
                android:textColor="@color/maroon"
                android:singleLine="true" 
                android:ellipsize="end" 
                android:textSize="14sp"
                android:textStyle="bold" 
                android:layout_weight="1" />

            <ImageView 
                android:id="@+id/reviewItemStarRating"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_alignParentBottom="true"
                android:src="@drawable/title_1_star" />
        </LinearLayout>

        <TextView 
            android:id="@+id/reviewItemDescription"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:text="Description comes here" 
            android:textSize="12sp" 
            android:layout_weight="1"/>
    </LinearLayout>
</LinearLayout>

12
Lưu ý: bạn chỉ cần có xmlns:android="http://schemas.android.com/apk/res/android"phần tử gốc.
Jeremy Logan

Trong trường hợp của tôi, tôi có một TextView rất lớn hiển thị một số và cả phía trên và phía dưới số đó đều còn một khoảng trống lớn đáng kể. Tôi nhanh chóng nhận ra rằng không gian dành cho những nhân vật khác. TextView dường như dành khoảng trống đó cho các ký tự bên dưới một số như "2g", trong đó Phần dưới của "g" sẽ sử dụng không gian thấp hơn đó.
Benjamin Basmaci

Câu trả lời:


82

Tôi đã tự sửa nó, chìa khóa là android:width="0dip"

<LinearLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="4dip"
    android:layout_weight="1">

    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="4dip">

        <TextView
            android:id="@+id/reviewItemEntityName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/maroon"
            android:singleLine="true"
            android:ellipsize="end"
            android:textSize="14sp"
            android:textStyle="bold"
            android:layout_weight="1" />

        <ImageView
            android:id="@+id/reviewItemStarRating"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentBottom="true" />
        </LinearLayout>

        <TextView
            android:id="@+id/reviewItemDescription"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textSize="12sp"
            android:width="0dip" />

    </LinearLayout>

    <ImageView
        android:id="@+id/widget01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/arrow_nxt"
        android:layout_gravity="center_vertical"
        android:paddingRight="5dip" />

</LinearLayout> 


33
sử dụng tốt hơn android:layout_weight=1thay vì zero-width, điều đó có nghĩa là textview sẽ lấp đầy nội dung còn lại
shaman.sir 15/09/10

1
android: layout_weight = "1" không hoạt động trên S3 của tôi, nhưng android: width = "0dip" thì không? Thật là kỳ lạ. Bất kỳ lời giải thích?
productioncoder

nếu bạn sử dụng GridLayout, bạn sẽ muốn sử dụng columnWeight và nó chỉ có sẵn cho v21 hoặc mới hơn.
Johnny Wu

Điều này hoạt động tốt nếu tôi muốn đặt văn bản kết thúc bằng một dòng. Điều gì xảy ra nếu tôi muốn đặt văn bản kết thúc cho nhiều hơn 1 dòng. Trong giải pháp trên nếu tôi đặt android: singleLine = "false", thì giải pháp không hoạt động
tejraj

39

Câu trả lời chỉ đúng cho câu hỏi này là bạn cần phải thiết lập các bậc cha mẹ có chiều rộng thích hợp (trong trường hợp này FILL_PARENT, WRAP_CONTENT) và sử dụng android:layout_weight=1cho TextView rằng nhu cầu để được bao bọc.

SingleLine được bật theo mặc định để không thực hiện bất kỳ thay đổi nào.

Một widththiết lập để 0px sẽ làm việc nhưng không phải là một giải pháp tốt.

Một số ví dụ (trong lần xem bảng lần này), sử dụng xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical">
    <TableLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:stretchColumns="*"
        android:id="@+id/tableLayout1">
        <TableRow android:id="@+id/tableRow1" android:layout_width="fill_parent"
            android:layout_height="wrap_content">
            <TextView android:text="test1" android:layout_width="fill_parent"
                android:layout_height="wrap_content" android:layout_weight="0" />
            <TextView android:layout_weight="1"
                android:text="test2 very long text that needs to be wrapped properly using layout_weight property and ignoring singleline since that is set by default..."
                android:layout_width="fill_parent" android:layout_height="wrap_content" />
        </TableRow>     
    </TableLayout>
</LinearLayout>

Nếu bạn muốn đặt điều này trong mã, bạn đang tìm layout_weight làm tham số thứ ba như trong ví dụ này, nơi nó được đặt thành 1:

row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));
TextView label = new TextView(getApplicationContext());
label.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT, 1f));

19

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 bọc trên bao nhiêu dòng nếu cần


1
Tôi thấy trong trường hợp của mình, tôi phải thêm android: maxLines = "X" cùng với hai thứ này. X là số bất kỳ (hơn 1 rõ ràng) Các văn bản sau đó quấn trên Android 2.3
Guykun

13

Nó đủ để sử dụng trong tệp xml của bạn.

android:singleLine="false".

Hy vọng nó sẽ hoạt động.

Tất cả tốt nhất!


10

Tôi không thể nhận được bất kỳ giải pháp nào trong số này hoạt động khi sử dụng a TableLayout>TableRow>TextView. Sau đó tôi tìm thấy TableLayout.shrinkColumns="*". Giải pháp duy nhất khác hoạt động là buộc TextView phải layout_width:250pxvv nhưng tôi không thích buộc chiều rộng như vậy.

Hãy thử một cái gì đó như thế này nếu làm việc với các bảng.

            <TableLayout 
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:shrinkColumns="*">

Lưu ý bạn cần shrinkColumns="*"

Điều này rõ ràng là trong một <LinearLayout>. Vì vậy, một cái gì đó như<LinearLayout> <TableLayout> <TableRow> <TextView>

người giới thiệu:

TableLayout

http://code.google.com/p/android/issues/detail?id=4000

Hy vọng rằng sẽ giúp một ai đó.


4

Một trong các thông số bố cục của bạn sai trong mã của bạn. Trong TextView đầu tiên

android:layout_width="wrap_content"

thay đổi thành

android:layout_width="fill_parent" 

Văn bản nằm ngoài kích thước chiều rộng màn hình sẽ chuyển sang dòng tiếp theo và được đặt android:singleline="false".


8
Tôi nghĩ rằng fill_parentđã không được chấp nhận và thay thế bằng match_parent.
RCB

3

Đặt chiều cao của dạng xem văn bản android:minHeight="some pixes"hoặc android:width="some pixels". Nó sẽ giải quyết vấn đề.


3

Đối với trường hợp của tôi, việc xóa loại nhập liệu đã xảy ra lỗi, tôi đang sử dụng android: inputType = "textPostalAddress" do chế độ xem văn bản của tôi bị dính vào một dòng và không được bao bọc, việc xóa này đã khắc phục sự cố.


1

Tôi là người mới bắt đầu sử dụng Android (và GUI), nhưng có nhiều kinh nghiệm với phần mềm. Tôi đã xem qua một số hướng dẫn và đây là hiểu biết của tôi:

layout_ width và layout_height là các thuộc tính của TextView. Chúng là những hướng dẫn về cách TextView sẽ tự định hình, chúng không đề cập đến cách xử lý nội dung trong TextView.

Nếu bạn sử dụng "fill_parent", bạn đang nói rằng TextView sẽ tự định hình so với dạng xem gốc của nó, nó sẽ lấp đầy nó.

Nếu bạn sử dụng "wrap_content", bạn đang nói rằng bạn nên bỏ qua chế độ xem chính và để nội dung của TextView xác định hình dạng của nó.

Tôi nghĩ đây là điểm khó hiểu. "wrap_content" không cho TextView biết cách quản lý nội dung của nó (để bọc các dòng), nó cho biết rằng nó sẽ tự định hình so với nội dung của nó. Trong trường hợp này, không có ký tự dòng mới, nó tự định hình để tất cả văn bản nằm trên một dòng duy nhất (tiếc là làm tràn dòng cha).

Tôi nghĩ bạn muốn nó lấp đầy phần cha theo chiều ngang và bọc nội dung của nó theo chiều dọc.


1

Mặc dù đây là một chủ đề cũ, tôi muốn chia sẻ kinh nghiệm của mình vì nó đã giúp tôi. Ứng dụng của tôi hoạt động tốt cho OS 2.0 & 4.0+ nhưng đối với điện thoại HTC chạy OS 3.x, văn bản không được bao bọc. Điều làm việc cho tôi là bao gồm cả hai thẻ này.

android:maxLines="100"
android:scrollHorizontally="false"

Nếu bạn loại bỏ một trong hai, nó không hoạt động chỉ với thiết bị chạy hệ điều hành 3.0. Tham số "ellipsize" có tác dụng trung lập. Đây là thẻ textview đầy đủ bên dưới

<TextView
                android:id="@+id/cell_description"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:paddingTop="5dp"
                android:maxLines="100"
                android:scrollHorizontally="false"
                android:textStyle="normal"
                android:textSize="11sp"
                android:textColor="@color/listcell_detail"/>

Hy vọng điều này sẽ giúp một ai đó.


1

Tăng chiều cao tức là. android: height = "Some size", nó đang hoạt động tốt đối với tôi.


1

Tôi đã gặp sự cố tương tự khi hai TextView có trọng số theo chiều ngang của tôi không bao bọc văn bản. Sau đó, tôi phát hiện ra rằng vấn đề là do cha mẹ trong chế độ xem của tôi có wrap_content thay vì match_parent.


0

Tôi nghĩ nó phụ thuộc vào sự kết hợp cụ thể của bố cục trong màn hình của bạn. Một số cờ có thể bị ghi đè hoặc bị bỏ qua. Tôi có một TabHost với các tab, mỗi tab là một danh sách các bảng. Vì vậy, nó là một tab của ListView, mỗi hàng là một TableLayout của TextView. Tôi đã thử các bản sửa lỗi được liệt kê ở trên và không có cách nào trong số chúng hoạt động.


0

Tôi biết, điều đó trong câu hỏi là đúng, nhưng trong trường hợp của tôi, vấn đề là khi đặt thuộc tính textSize trong 'dp' - Tôi đã thay đổi nó thành 'sp' và nó hoạt động tốt.


0

Trong trường hợp của tôi, với TableRow > ScrollView > TextViewlồng ghép, tôi đã giải quyết vấn đề bằng cách đặt android:layout_widththành fill_parentbật TableRow, và wrap_contentbật ScrollViewTextView.


0

bạn phải sử dụng android:singleLine="false"trong TextViewthẻ ur .


0

Cuối cùng tôi đã quản lý để thêm một số pixel vào chiều cao của TextView để giải quyết vấn đề này.

Trước tiên, bạn cần thực sự lấy chiều cao của TextView. Nó không đơn giản vì nó là 0 trước khi nó đã được sơn.

Thêm mã này vào onCreate:

mReceiveInfoTextView = (TextView) findViewById(R.id.receive_info_txt);
if (mReceiveInfoTextView != null) { 
    final ViewTreeObserver observer = mReceiveInfoTextView.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int height = mReceiveInfoTextView.getHeight();
            int addHeight = getResources().getDimensionPixelSize(R.dimen.view_add_height);
            mReceiveInfoTextView.setHeight(height + addHeight);

            // Remove the listener if possible
            ViewTreeObserver viewTreeObserver = mReceiveInfoTextView.getViewTreeObserver();
            if (viewTreeObserver.isAlive()) {
                viewTreeObserver.removeOnGlobalLayoutListener(this);
            }
        }
    });
}

Bạn cần thêm dòng này vàomens.xml

<dimen name="view_add_height">10dp</dimen>

Hy vọng nó giúp.


0

Tôi vừa xóa android:lines="1"và thêm android:maxLines="2", điều này sẽ tự động quấn văn bản. Vấn đề là android:linesthuộc tính. Điều đó làm cho việc gói văn bản không xảy ra.

Tôi không phải sử dụng maxEmshoặc singleLine="false"(API không dùng nữa) để sửa lỗi này.


0

Tôi đã dành hàng giờ để tìm ra rằng trong văn bản mà tôi đang cố gắng hiển thị có chứa một trích dẫn duy nhất (trong string.xml) vì vậy tôi chỉ cần thoát nó bằng dấu gạch chéo ngược và nó hoạt động tốt => chiều cao của TextView đã chính xác gói văn bản :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-smallcaps"
        android:text="@string/instructions"
        android:textAlignment="center"
        android:textSize="18sp"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/keyword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/defaultKeyword"
        android:textSize="22sp"
        />

0

Tôi chủ yếu sử dụng bố cục ràng buộc.

1) android:layout_width="match_parent"= cố gắng kéo dài để đáp ứng các cạnh

2) android:layout_width="wrap_content"= chỉ dựa trên văn bản đầu vào mà không quan tâm đến các chế độ xem khác gần đó. ví dụ thêm android:textAlignment="center"sẽ thay đổi hình dạng của văn bản

3) android:padding="12dp" android:layout_width="0dp" android:layout_weight="1" android:singleLine="false"

= Văn bản sẽ gấp lại để phù hợp với các bố cục lân cận mà không liên quan đến chính văn bản


-1

Tôi đặt thuộc tính này:

android:inputType="textMultiLine"

vào TextView của tôi và nó có dòng bao và người dùng có thể "Enter" cho một dòng mới.

================================================== ==========

Khi bạn đến với bài đăng này, bạn có thể muốn tạo một TextView lớn có thể hiển thị nhiều dòng để các thuộc tính này cũng có thể cần

android:layout_height="Xdp" //where X is a number depends on how big Textview you want
android:gravity="top" //in order to make your text start from the top of your TextView.

7
Điều này dành cho EditText, không phải TextView.
Justin

-1

Tôi đã từng android:ems="23"giải quyết vấn đề của mình. Chỉ cần thay thế 23 bằng giá trị tốt nhất trong trường hợp của bạn.

<TextView
        android:id="@+id/msg"
        android:ems="23"
        android:text="ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab "
        android:textColor="@color/white"
        android:textStyle="bold"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

-1

Tôi đã thêm \ n vào giữa chuỗi của mình và nó có vẻ ổn.


Điều này sẽ không xảy ra trong mọi tình huống. Xem xét các tình huống mà văn bản có thể động.
the_new_mr

-5

Để bọc văn bản và để đặt văn bản ở dòng tiếp theo, chúng tôi sử dụng "\ n" tức là ký tự dòng mới trong tệp xml bố cục và kiểm tra sự thay đổi trên trình giả lập không phải trên màn hình bố cục.


3
Đó là chỉ ngắt dòng tại một số điểm nhất định. Để gói dựa trên kích thước màn hình có sẵn (chiều rộng khung nhìn), chúng ta cần một thứ khác.
hcpl
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.