2012-01-12 18 views
10

Nếu tôi đặt SingleLine = true trên tiện ích EditText, tôi sẽ có một điều khiển chỉnh sửa dòng đơn không cho phép người dùng chèn vào trường tiếp theo thay vì chèn một dòng mới). Nếu tôi không đặt SingleLine = true, người dùng có thể chèn trả về cứng.Android EditText với từ bọc nhưng không có kết quả cứng

Nếu tôi đặt layout_height = "wrap_content", điều khiển EditText sẽ tăng theo chiều dọc để hiển thị tất cả văn bản. Tuy nhiên, nó chỉ thực hiện điều này nếu SingleLine không được đặt thành true.

Vì vậy, câu hỏi của tôi là, có thể thay đổi kích thước từ và đóng gói dọc mà không cho phép người dùng nhập vào ngắt dòng cứng không? Tôi đoán tôi có thể bẫy nhập keypress, nhưng sau đó tôi cũng sẽ phải nắm bắt những cách khác mà họ có thể nhận được một trong đó (sao chép/dán, không chắc chắn những gì khác?). Có cách nào đơn giản để làm điều này chỉ với sự kết hợp của các thuộc tính?

Tôi thích từ bọc, nơi người dùng có thể xem tất cả văn bản, so với cuộn ngang của điều khiển chỉnh sửa một dòng, nhưng tôi thực sự không muốn họ nghĩ rằng họ có thể nhập văn bản nhiều dòng (và tôi không muốn phải hỗ trợ nó). Tôi đoán tôi chỉ có thể chuyển đổi trở lại cứng thành không gian khi tôi lưu dữ liệu vào cơ sở dữ liệu của mình, nếu tôi phải (ứng dụng cũ tôi đồng bộ dữ liệu này với PC không thể xử lý trở lại cứng).

Trả lời

12

Tôi cũng đang tìm kiếm điều gì đó để làm việc này. Giải pháp duy nhất tôi thấy được để kéo dài tuổi EditText như sau:

package com.kylemilligan.test; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.inputmethod.EditorInfo; 
import android.view.inputmethod.InputConnection; 
import android.widget.EditText; 

public class NoNewlineEditText extends EditText 
{ 

    public NoNewlineEditText(Context context) { 
     super(context); 
    } 

    public NoNewlineEditText(Context context, AttributeSet attributeSet) { 
     super(context, attributeSet); 
    }  

    @Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) 
    { 
     InputConnection connection = super.onCreateInputConnection(outAttrs); 
     int imeActions = outAttrs.imeOptions & EditorInfo.IME_MASK_ACTION; 
     if ((imeActions & EditorInfo.IME_ACTION_DONE) != 0) 
     { 
      // clear the existing action 
      outAttrs.imeOptions ^= imeActions; 
      // set the DONE action 
      outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE; 
     } 
     if ((outAttrs.imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) 
     { 
      outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION; 
     } 
     return connection; 
    } 
} 

Và sau đó sử dụng XML như:

 <com.kylemilligan.test.NoNewlineEditText 
      android:id="@+id/noNewLineText" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="top|left" 
      android:imeOptions="actionDone" 
      android:minLines="5" /> 

Hope this helps!

+0

Vì vậy, hữu ích. Tôi không biết tại sao điều này không được cung cấp như một hành vi tích hợp. – JulianSymes

+6

Tính năng này hoạt động vì Android tự động đặt 'EditorInfo.IME_FLAG_NO_ENTER_ACTION' trên chế độ xem văn bản nhiều dòng. Bạn có thể đơn giản hóa việc này thành chỉ: 'Kết nối InputConnection = super.onCreateInputConnection (outAttrs); outAttrs.imeOptions & = ~ (EditorInfo.IME_FLAG_NO_ENTER_ACTION); kết nối trả về; ' – Foxichu

3

Tôi đã quan tâm đến điều này và nhận ra rằng ứng dụng nhắn tin Android tích hợp đã gói văn bản mà không cần nhập phím trên bàn phím mềm. Theo bố cục nguồn here, nó được thực hiện với các tùy chọn sau. Không phải tất cả đều là cần thiết; Tôi tin rằng chính là để có textShortMessage, textMultiLine, và flagNoEnterAction:

android:inputType="textShortMessage|textAutoCorrect|textCapSentences|textMultiLine" 
android:imeOptions="actionSend|flagNoEnterAction" 
+0

Đây là giải pháp tốt hơn so với những người khác tôi đã thấy. – bond

+0

Hầu như. Tôi không thể sử dụng giải pháp này vì nó dường như không cho phép tôi sử dụng 'actionDone'. Tôi không muốn biểu tượng cảm xúc, hoặc bất cứ thứ gì khác như thế; Tôi chỉ muốn một hành động 'thực hiện', và tôi không thể làm cho nó hoạt động với giải pháp này. –

0
editText.setImeOptions(EditorInfo.IME_ACTION_DONE); 
//This will treat Enter as Done instead of new line: 
editText.setRawInputType(InputType.TYPE_CLASS_TEXT); 

And in XML: 
android:inputType="textMultiLine" 
Các vấn đề liên quan