52

singleLine được/đã được sử dụng trong các tập tin xml bố trí cho TextViewEditText giống như sau:Thuộc tính xml singleLine có bị phản đối hay không trong Android?

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:singleLine="true" /> 

Some people trên SO nói singleLine bị phản đối, trong khi other people vẫn đề nghị sử dụng nó. Đôi khi nó thậm chí có vẻ cần thiết để sử dụng khi maxLines="1" không hoạt động. (xem here, herehere)

Tài liệu phải là nơi để trả lời câu hỏi này, đúng không? Here, they say:

This constant was deprecated in API level 3.

This attribute is deprecated. Use maxLines instead to change the layout of a static text, and use the textMultiLine flag in the inputType attribute instead for editable text views (if both singleLine and inputType are supplied, the inputType flags will override the value of singleLine).

Tuy nhiên, in the TextView docs, không có dấu hiệu cho thấy nó bị phản đối, hoặc cho android:singleLine hoặc cho setSingleLine hoặc cho setTransformationMethod. Các tài liệu TextView giống nhau, bằng cách so sánh, cho biết rằng những thứ khác như STATUS_BAR_HIDDENfitSystemWindows không còn được dùng nữa. Vì vậy, việc không sử dụng số singleLine là thiếu sót, có phải là "không được chấp nhận" hay không?

Câu hỏi này là previously asked before nhưng không phải là trọng tâm chính của câu hỏi (và không được trả lời).

+0

Trong trường hợp _maxLines = "1" _ không hoạt động? – JafarKhQ

+0

bạn có thể đăng khối 'mã' cho cả hai trường hợp không? – Gattsu

+1

Tôi không thực sự hỏi tại sao một ví dụ cụ thể của 'maxLines =" 1 "' được cho là không hoạt động. (Nó có thể là nó thực sự làm việc trong mọi trường hợp.) Tôi chỉ muốn biết nếu 'singleLine' thực sự bị phản đối hay không. Điều đó đang được nói, tôi không có bất kỳ ví dụ có thẩm quyền nào nhưng xem phần "ellipsize =" marquee "' của [câu trả lời này] (http://stackoverflow.com/a/30029722/3681880) và [câu hỏi này] (http : //stackoverflow.com/questions/24351698/textviews-ellipsize-not-working-on-maxlines-1) và cũng có [câu trả lời này có nhận xét] (http://stackoverflow.com/a/10748836/3681880). – Suragch

Trả lời

8

Trong grepcode chính thức của TextView (v5.1.0 r1):

android:singleLine không được chú thích với @Deprecated.

Tôi cũng thấy điều này trong setInputType phương pháp:

boolean singleLine = !isMultilineInputType(type); 

// We need to update the single line mode if it has changed or we 
// were previously in password mode. 
if (mSingleLine != singleLine || forceUpdate) { 
    // Change single line mode, but only change the transformation if 
    // we are not in password mode. 
    applySingleLine(singleLine, !isPassword, true); 
} 

setInputType ghi đè giá trị mSingleLine như vậy.

EDIT: Thuộc tính xml này hiện không được dùng nữa. (since API 3?). Nó hiện được hiển thị trong trình chỉnh sửa xml AndroidStudio.

39

Tôi nghĩ câu trả lời cho câu hỏi của bạn đã thuộc một trong số SO posts you linked to. Thật không may, việc ngưng sử dụng singleLines không phải là vấn đề đen trắng.

không được dùng nữa, nhưng nó là không sẽ chuyển sang bất kỳ đâu sớm.

Nó không được chấp nhận vì hiệu suất của nó kém, so với người kế nhiệm, maxLines. Nó sử dụng SingleLineTransformationMethod để thay thế dòng mới và trả về vận chuyển trong Chuỗi bạn đặt trong TextView, không giống như maxLines, mà "chỉ" điều chỉnh chiều cao của TextView dựa trên số dòng và không thay thế Chuỗi.

Phương pháp thay thế các ký tự này cũng có nghĩa là singleLine có thể break in unexpected ways (ví dụ: nếu bạn sử dụng phông chữ tùy chỉnh). Đó là những vấn đề về hiệu suất và độ tin cậy dẫn đến sự phản đối của nó.

Tuy nhiên, nó không được đi đâu hết vì, như SO đăng bài bạn liên kết với các quốc gia, nó vẫn được sử dụng bởi nhiều ứng dụng Android cũ, nó vẫn còn hữu ích đôi khi (ví dụ như khi bạn muốn hiển thị toàn bộ văn bản trên một dòng và bỏ qua các dòng trả về và dòng mới).

Lưu ý rằng việc ngừng sử dụng không nhất thiết có nghĩa là API sẽ biến mất. Nó chỉ có nghĩa là việc sử dụng nó không được khuyến khích, nhưng có thể được cho phép.

+0

Nếu nó thực sự không được chấp nhận, thì đó có phải là thực hành chính thức để đánh dấu nó như vậy trong suốt tài liệu không? Tuy nhiên, các tài liệu TextView không làm điều đó. Đó là điều khiến tôi băn khoăn liệu đây có phải là sự giám sát hay không hoặc nếu nó có mục đích mơ hồ hay cái gì đó khác. – Suragch

+1

@Suragch có, nó có thể là một sự giám sát (nó sẽ không là giám sát đầu tiên trong tài liệu Android). Hãy nhớ rằng nó đã không được chấp nhận rất sớm trong sự phát triển của Android. Trên thực tế, [git commit] (https://github.com/android/platform_frameworks_base/blob/d24b8183b93e781080b2c16c487e60d51c12da31/core/res/res/values/attrs.xml#L1701) không dùng nữa là một trong những cái đầu tiên trong Github's nhập nguồn Android và được đề ngày tháng 4 năm 2009. Nó không còn được dùng nữa trong quá trình phát triển, nhưng không phải tất cả các tài liệu đều được cập nhật. – ugo

+0

Tôi không chắc chắn lý do tại sao tài liệu này khuyên bạn nên sử dụng 'maxLines'. Nó không cung cấp hành vi giống như 'singleLine'. – Eliezer

17

Thuộc tính NỮA đã được bổ sung trong sự thay đổi d24b8183b9 đó là gì, nhưng một bãi chứa từ SCM nội bộ của Google:

auto import from //branches/cupcake/[email protected]

Như có thể thấy từ sự thay đổi core/res/res/values/attrs.xmldiff thêm bình luận doc @deprecated, nhưng core/java/android/widget/TextView.javadiff làm không thay đổi bất cứ điều gì từ bình luận doc của setSingleLine().

Bây giờ không được tiếp cận với lịch sử SCM nội bộ của Google, nó không thể biết chính xác những gì gây ra trên sự thay đổi trong attrs.xml doc comment, nhưng đối với câu hỏi của bạn

So is the singleLine deprecation an omission, was it "undeprecated", or what?

một câu trả lời có thể là: TextView 's đơn dòng không được chấp nhận, cũng không được "không được chấp nhận", nhưng nó được nâng cao để xem xét liệu khung nhìn có thể chỉnh sửa, trường mật khẩu hoặc sử dụng bất kỳ cờ kiểu đầu vào nào khác ảnh hưởng đến đơn/đa dạng hay không.

+2

Một số câu trả lời ở đây cung cấp một số thảo luận hữu ích và hiểu biết sâu sắc về vấn đề này, nhưng kể từ khi thời gian bounty lên gần, tôi trao nó cho câu trả lời này bởi vì nó đi sâu nhất và thu hút nhất từ ​​các nguồn đáng tin cậy và chính thức. Tôi chưa hoàn toàn sẵn sàng để chọn một câu trả lời được chấp nhận, tuy nhiên, mặc dù. – Suragch

4

Chỉ cần nghĩ rằng tôi sẽ thêm rằng Android Studio 2.2.1 cờ đơnLoại không được chấp nhận. Tuy nhiên, những gì tôi thấy là trong trường hợp của tôi:

android:singleLine="false" 

hoạt động tốt, trong khi

android:maxLines="2" 

không.

3

Trong khi Android Studio tuyên bố rằng nó không được chấp nhận, trên thực tế chúng tôi đã có một văn bản chỉnh sửa cho phép chính nó chỉ là một dòng.

Thêm maxLines="1" làm cho nó cho phép ký tự dòng mới, không phù hợp với nhu cầu của chúng tôi.

Vì vậy, chúng tôi đã quay lại sử dụng singleLine="true".

6

singleLine Không được dùng nữa. Không cần thảo luận.

Vấn đề duy nhất là tài liệu sai.
"sử dụng cờ textMultiLine trong thuộc tính inputType thay vì chế độ xem văn bản có thể chỉnh sửa" là đối diện trực tiếp với những gì bạn muốn đạt được bằng cách sử dụng singleLine.

Thay vì đó bạn có thể sử dụng android:inputType="text".
Đối với tôi, nó đã làm chính xác những gì tôi muốn - một bản chỉnh sửa với một dòng đơn không có ngắt dòng.

0

đơn giản cách thay thế, sử dụng: android:maxLines="1"

3

Tôi vừa thêm android:inputType="text" và loại bỏ android:maxLines="1", nó làm việc tốt cho tôi.

+0

Tôi đã xóa thuộc tính singleLine và tôi đã trả lời câu hỏi của bạn, nó hoạt động cho tôi xin chúc mừng! – oguzhan

3

Chỉ cần cho thêm một số chi tiết thông tin cho các cuộc thảo luận, Lint hiện nay có các lỗi sau:.

"Kết hợp ellipsizemaxLines=1 có thể dẫn đến sự cố trên một số thiết bị Đầu phiên bản của lint đề nghị thay thế singleLine=true với maxLines=1 nhưng điều đó nên không được thực hiện khi sử dụng ellipsize

Thông tin thêm:. https://issuetracker.google.com/issues/36950033 "

Vì vậy, tôi đoán rằng singleLine là bây giờ, và tôi nghĩ rằng chúng ta nên đưa ra với một thuật ngữ mới ... "phản đối"?

1

Chỉ cung cấp android:maxLines="1"android:minLines="1" sẽ không giải quyết vấn đề bàn phím actionNext vấn đề liên quan. Sử dụng android:inputType="text" cho tương tự.

Các vấn đề liên quan