2012-01-12 19 views
10

EditLext widget'ında SingleLine = true ayarını kullanırsam, kullanıcı tarafından zor geri dönüşlerin girilmesine izin vermeyen tek satırlık bir düzenleme denetimi alırım yeni bir satır eklemek yerine bir sonraki alan). SingleLine = true ayarlamazsam, kullanıcı sert dönüşler ekleyebilir.Android EditText word-wrap ile zorlandı, ancak sabit değil

layout_height = "wrap_content" öğesini ayarlarsam, EditText denetimi tüm metni göstermek için dikey olarak büyür. Ancak, yalnızca SingleLine true olarak ayarlanmamışsa bunu yapar.

Yani, benim sorum şu ki, kullanıcı sert satır sonları girmesine izin vermeden, sözcük kaydırma ve dikey yeniden boyutlandırma almak mümkün mü? Sanırım enter tuşuna basabilirim, ama sonra bir tane alabilecekleri başka yolları da yakalayacağım (kopyala/yapıştır, başka ne olduğundan emin değil misiniz?). Bunu yalnızca özelliklerin doğru kombinasyonuyla yapmak için basit bir yol var mı?

Tek satırlık düzenleme denetiminin yatay kaydırmasıyla karşılaştırıldığında kullanıcının tüm metni görebileceği sözcük sarmayı tercih ederim, ancak çok satırlı metin girebildiklerini düşünmelerini istemiyorum (ve bunu desteklemek zorunda kalmak istemiyorum). Veriyi veritabanıma kaydettiğimde sabit getirileri sadece alanlara dönüştürebilirim, eğer gerekiyorsa (bu verileri PC'de senkronize ettiğim eski uygulama, zor geri dönüşlerle başa çıkamaz).

cevap

12

Ben de bunu yapmak için bir şey arıyordum. gibi XML kullanımda sonra

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

Ve: Bu yardımcı olur

 <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 aşağıdaki gibi buldum tek çözüm EditText uzatmak oldu!

+0

Yani yararlıdır. Bunun neden yerleşik bir davranış olarak sunulmadığını bilmiyorum. – JulianSymes

+6

Bu, Android'in çok satırlı metin görünümlerinde otomatik olarak 'EditorInfo.IME_FLAG_NO_ENTER_ACTION 'öğesini ayarladığı için çalışır. Bunu şu şekilde basitleştirebilirsiniz: 'InputConnection connection = super.onCreateInputConnection (outAttrs); outAttrs.imeOptions & = ~ (EditorInfo.IME_FLAG_NO_ENTER_ACTION); dönüş bağlantısı; ' – Foxichu

3

Bu konuyla ilgileniyordum ve yerleşik Android mesajlaşma uygulamasının yumuşak klavye üzerindeki enter tuşu olmadan metni sardığını fark ettim. Kaynak düzenine göre here, aşağıdaki seçeneklerle yapılır. Hepsi gerekli değil; Ben anahtar textShortMessage, textMultiLine ve flagNoEnterAction sahip olmaktır inanıyoruz:

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

Bu, gördüğüm diğerlerine kıyasla daha iyi bir çözüm. – bond

+0

Neredeyse. Bu çözümü kullanamadım çünkü 'actionDone' kullanmama izin vermiyor gibi görünüyor. Emojiyi istemiyorum, ya da başka bir şey; Sadece bir 'bitti' eylemi istiyorum ve bu çözümle çalışmasını sağlayamıyorum. –

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"