2012-05-16 45 views
6

Tôi biết có rất nhiều câu hỏi liên quan trong Stackoverflow, nhưng tôi đã cố gắng thực hiện mọi thứ được viết trong bất kỳ phần nào và cho đến nay tôi không thể làm việc này.EditText sẽ không bao bọc văn bản

Vấn đề của tôi rất đơn giản. Tôi có một ứng dụng Android và tôi có một hộp nơi người dùng sẽ nhập văn bản. Tuy nhiên, tôi không muốn văn bản này được nhiều dòng (nó không nên có "\ n" trong nó), nhưng tôi muốn nó để bọc nếu kích thước của dòng lớn hơn khung nhìn. Vì vậy, về cơ bản, những gì tôi muốn là hành vi tương tự mà các textBox trên lĩnh vực chủ đề Gmail có.

Đây là toàn bộ quan điểm của tôi:

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

<TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/question" 
     android:textAppearance="@style/titleFont"/> 

<EditText 
    android:id="@+id/edit_question_value" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="0.3" 
    android:gravity="top" 
    android:inputType="textImeMultiLine|textEmailSubject" 
    android:maxLength="70" 
     > 

</EditText> 

<TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/answer" 
     android:textAppearance="@style/titleFont"/> 

<EditText 
     android:id="@+id/edit_question_answer" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:gravity="top" 
     android:layout_weight="0.7" 
     android:inputType="textMultiLine"/> 

<LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal"> 

    <Button 
      android:id="@+id/save_question" 
      android:layout_width="120dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:layout_weight="0.5" 
      android:text="@string/save"/> 

    <Button 
      android:id="@+id/cancel_edit_question" 
      android:layout_width="120dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.5" 
      android:text="@string/cancel"/> 
</LinearLayout> 

Văn bản Tôi muốn có hành vi này là TheOne với id tương đương với @ + id/edit_question_value. Cho đến nay, tôi đã có thể làm cho nó thực sự đa phương (vì vậy người dùng có thể gõ enter nếu anh ta muốn) hoặc một dòng và văn bản sẽ không quấn. Có lẽ một số các yếu tố xung quanh văn bản đang có một số can thiệp, và đó là lý do tại sao tôi bao gồm toàn bộ quan điểm.

Có ai biết điều gì đang xảy ra không?

Trả lời

8

Đây là điều đã làm phiền nhiều người trước và tôi có thể tìm thấy câu trả lời khi tôi cần. Trong thuần XML, đó là. Nếu chúng ta có thể sử dụng lập trình và không chỉ đánh dấu, chúng tôi có thể làm điều này với một chút hack nếu bạn có thể. Về cơ bản, chúng tôi đang khai báo một editText đa dòng và sau đó bắt phím quay lại để tránh các dòng mới.

Đầu tiên tuyên bố trong xml:

<EditText 
    android:id="@+id/noReturnEditText" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:imeOptions="actionDone" 
    android:inputType="textMultiLine|textCapSentences" 
    android:text="lorem ipsum \n dolor site amet helping stackoverflow" /> 

Vâng, tôi biết những gì bạn đang suy nghĩ "Nhưng hey, Juan đây là một multiliner EditText và tôi muốn có một liner như về đề tài này khu vực của gmail ". Tôi biết, tôi biết, nhưng chúng tôi sẽ chăm sóc nó ngay bây giờ, bằng cách loại bỏ các hành vi của phần multiline chúng tôi không muốn, trong khi vẫn giữ gói văn bản chúng tôi làm muốn.

Bây giờ phần còn lại của đang:

EditText noReturnEditText = (EditText) findViewById(R.id.noReturnEditText); 
     noReturnEditText.setOnKeyListener(new OnKeyListener(){ 
      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       if (keyCode == KeyEvent.KEYCODE_ENTER) return true; 
       return false; 
      } 
     }); 

Bạn có lẽ có thể đọc mã khá dễ dàng, nhưng trong trường hợp ai đó cần một lời giải thích, chúng tôi đang thiết lập một OnKeyListener đến EditText chúng tôi muốn trở thành " oneline-multilinelike "và nếu người dùng nhấn phím trả về (KEYCODE_ENTER), chúng tôi yêu cầu sự kiện không được truyền bằng cách trả lại true trong ngữ cảnh này có nghĩa là chúng tôi đã xử lý sự kiện.

Kết quả:

enter image description here

cân nhắc

Nhấn phím Enter không phải là cách duy nhất bước vào một dòng mới. Người dùng có thể sao chép/dán một số văn bản và kết thúc bằng một mục nhập nhiều dòng trên một dòng EditText. Lo lắng không!Chúng ta có thể dải giá trị trước khi chúng ta lưu trữ nó hoặc sử dụng nó với một cái gì đó giống như

myData = rawText.replace(System.getProperty("line.separator"), " ");

gì nếu tôi có rất nhiều quan điểm EditText?

Vâng, về cơ bản bạn có hai tùy chọn. Làm từng cái một và kéo mắt ra hoặc làm một cái gì đó như thế này, liệt kê các lượt xem và vòng lặp cho mỗi chế độ xem.

//Declare the reusable listener 
    OnKeyListener myListener = new OnKeyListener(){ 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_ENTER) return true; 
      return false; 
     } 
    } 
//Loop through the views 
    int viewIds[] = {R.id.edittext1,R.id.edittext2,R.id.edittext3,R.id.edittext4}; 
    for(int id : viewIds) ((EditText)findViewById).setOnKeyListener(myListener); 
Các vấn đề liên quan