2.3'te Bitti SoftInput Eylem Etiketi ile Çok Satırlı Düzenleme Metni


82

EditTextAndroid 2.3'te Multi-Line bulundurmanın ve IME Eylem Etiketini "Bitti" kullanmanın bir yolu var mı?

Android 2.2'de bu bir sorun değildir, enter düğmesi IME Eylem Etiketini "Bitti" ( android:imeActionLabel="actionDone") gösterir ve tıklandığında Esnek Giriş'i kapatır.

Bir EditTextçoklu hat için yapılandırırken , Android 2.3, Yumuşak Giriş klavyesi için "Bitti" eylemini gösterme özelliğini kaldırır.

Bir kullanarak Yumuşak Giriş giriş düğmesinin davranışını değiştirmeyi başardım KeyListener, ancak giriş düğmesi hala bir giriş anahtarı gibi görünüyor.


İşte beyanı EditText

<EditText
        android:id="@+id/Comment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="0dp"
        android:lines="3"
        android:maxLines="3"
        android:minLines="3"
        android:maxLength="60"
        android:scrollHorizontally="false"
        android:hint="hint"
        android:gravity="top|left"
        android:textColor="#888"
        android:textSize="14dp"
        />
<!-- android:inputType="text" will kill the multiline on 2.3! -->
<!-- android:imeOptions="actionDone" switches to a "t9" like soft input -->

inputTypeAktivitede içerik görünümünü ayarladıktan sonra değeri kontrol ettiğimde şu şekilde görünüyor:

inputType = 0x20001

Hangisi:

  • class = TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
  • bayraklar = InputType.TYPE_TEXT_FLAG_MULTI_LINE

Yanıtlar:


163

TextViewVe EditorInfobelgelerini yeniden okuduktan sonra , platformun IME_FLAG_NO_ENTER_ACTIONçok satırlı metin görünümleri için zorlayacağı anlaşıldı .

TextViewBu bayrağı sizin için çok satırlı metin görünümlerinde otomatik olarak ayarlayacağını unutmayın .

EditTextÇözümüm, platformun bunları yapılandırmasına izin verdikten sonra IME seçeneklerini alt sınıfa ayırmak ve ayarlamaktır:

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

Yukarıda, IME_ACTION_DONEsıkıcı bir düzen yapılandırmasıyla elde edilebilecek olsa da , ben de zorluyorum .


24
Genelde 'şükürler olsun' gibi genel yorumlar vermem ama bu cevap yeterince yardımcı oldu ve takdir edilmeyi hak ettiğini düşündüğüm için takdir edilmedi. Özetle, çok teşekkürler. :-)
saban adam

3
Cevap için +1, ancak bu durumda koddan bir edittext girişi türü ayarlıyorsanız. Dikey kaydırmayı kaldırır ve yatay kaydırma ekler. Bu sorunu çözmek için aşağıdaki kodu kullanın. editTextObj.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_MULTI_LINE); Bir görünümü birden çok mizanpaja ekleyerek yeniden kullanıyorsanız genellikle olabilir. @ohhorob çözüm için çok teşekkürler.
Jayshil Dave

2
Mucizevi şekilde çalışır! Ama kodu gerçekten anlamıyorum. Tüm bayrak mekanizmasını okuyabileceğim bir yerin var mı?
vanleeuwenbram

Teşekkürler, yeni başlayan biriyim, bunu bir iletişim kutusu kullanan aktiviteme koydum EditText, bu yüzden xml aktivitemde yer almıyor. Benim aktivitesinde Bu kodu koyarak çalıştı, ancak bir hata var: The method onCreateInputConnection(EditorInfo) of type SMSMain must override or implement a supertype method. Sen buna superçok emin değilim sorunun ne olduğunu, başlangıçta. Herhangi bir öneriniz var mı? Teşekkürler.
Azurespot

@NoniA. EditText'in alt sınıfını yapmalısınız. ve bu sınıfta bu yöntemi çağırmanız gerekir. EditText'e uzanan bir sınıf oluşturun. ve bu yöntemi o sınıfa koyun.
Shah

104

Ohhorob'un cevabı temelde doğrudur, ancak kodu gerçekten gereksizdir! Temelde bu çok daha basit sürüme eşdeğerdir (tembel okuyucular için tam kod):

package com.example.views;

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

// An EditText that lets you use actions ("Done", "Go", etc.) on multi-line edits.
public class ActionEditText extends EditText
{
    public ActionEditText(Context context)
    {
        super(context);
    }

    public ActionEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ActionEditText(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs)
    {
        InputConnection conn = super.onCreateInputConnection(outAttrs);
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        return conn;
    }
}

Bunu yapmak inputTypegibi bazı seçeneklerin textShortMessageişe yaramayacağını unutmayın! İle başlamanı öneririm inputType="text". Bunu XML'nizde nasıl kullanabileceğiniz aşağıda açıklanmıştır.

<com.example.views.ActionEditText
    android:id=...
    android:layout_stuff=...
    android:imeOptions="actionDone"
    android:inputType="textAutoCorrect|textCapSentences|textMultiLine"
    android:maxLines="3" />

Timmmm, bu 2.3'te test edildi mi?
ohhorob

1
Kodunuz 2.3 üzerinde çalışıyorsa benimki de öyle. Hemen hemen aynılar ve benimkini veya kodunuzu temel alıyorum, bu yüzden teşekkürler! 4.0'da olmayan 2.3'ün kendine özgü özellikleri var mı? Standart "çok satırlı düzenlemelerde işlem yok", Google tarafından eklenen kasıtlı davranıştır.
Timmmm

5
Bunu 2.3 (ve 4.x) üzerinde denedim ve uygulamam için işe yaradı.
mlc

2
@ matej.smitala Evet, ikisine birden sahip olamazsınız.
Timmmm

1
En iyi çözümü saatlerce aradıktan sonra, bu, enter tuşu olmadan çok satırlı bir düzenleme metni elde etmenin en iyi ve en basit yolu gibi görünüyor.
micnguyen

56

EditText sınıfını alt sınıflara ayırmanın alternatif bir çözümü, EditText örneğinizi şununla yapılandırmaktır:

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);

En azından bu benim için Android 4.0'da çalışıyor. EditText örneğini, bir IME eylemi ayarlanmış olsa bile kullanıcının birden çok satırda yumuşak kaydırmayla görüntülenen tek satırlık bir dizeyi düzenleyeceği şekilde yapılandırır.


2
@Futzilogik: Siz efendim, çok daha fazla oyu hak ediyorsunuz! Bu cevap hem hayat kurtarıcıydı hem de basitti. Yani, Aman Tanrım. Keşke birden fazla oy verebilseydim. Çok teşekkürler!
Swayam

3
4.4.2 çalıştırıyorum ve bu benim için ya da en azından benim için işe yaramadı. Bunu yalnızca XML olarak yaptım, bu bir sorun olabilir. İnputType'ı "textEmailAddress | textMultiLine" scrollHorizontally'den false'a, maxLines'den 500'e (xml dosyası), singleLine'dan false'a ve imeOptions'ı actionNext olarak yapılandırdım. Girdi türünden "textMultiLine" öğesini kaldırmayı denedim. TextMultiLine ile klavyede ENTER tuşunu alıyorum ve bu tuş olmadan her şey tek bir satırda kalıyor ve yine de yatay olarak kayıyor. Bu en kolay çözüm gibi göründü, ancak yukarıdaki çözüm benim için çalışıyor, bu yüzden şimdilik onunla devam ediyorum.
reaktif çekirdek

6
Önceki yorumumla ilgili olarak (düzenleyemiyor), bunun MAX_VALUE ayarlamamayla ilgili bir sorun olduğundan veya edittext oluşturulduktan sonra bunları değiştirdiğinden şüphelenerek, burada belirtildiği gibi kodu denedim ve işe yarıyor! Sadece başkaları için gönderi yapmak istedim, bunu XML olarak yapamazsın (ya da ben yapamadım). Sahip olduğum diğer ayarlar: singleLine = false, imeOptions = actionNext, inputType = textEmailAddress (çoklu satır yok).
reaktif-çekirdek

çok iyi çalışıyor. Bu eski bir yanıtı geliştirmenin güzel bir örneğidir !!
nPn

Benim için Lollipop çalıştıran bir Galaxy S5 üzerinde çalışıyor. Harika çözüm.
Xml'de

7

Önceki cevabın ardından

public class MultiLineText extends EditText {

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

    public MultiLineText(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public MultiLineText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

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

Bunu şöyle kullan

<myapp.commun.MultiLineText
  android:id="@+id/textNotes"
  android:layout_height="wrap_content"
  android:minHeight="100dp"
  android:layout_width="wrap_content"
  android:hint="Notes"
  android:textSize="20sp"
  android:padding="7dp"
  android:maxLines="4"/> 

5

Bitti eylemini koymak için şunları kullanabilirsiniz:

XML

android:inputType="text|textCapSentences"    

JAVA

editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);

Umarım sizin için çalışır.


1

Görünüşe göre orijinal sorunun cevabı Evet, ancak Android ekibinin geliştiricilere çok satırlı EditText'i nasıl kullandıkları hakkında biraz düşündürmeye çalıştığına inanıyorum. Enter tuşunun yeni satırlar eklemesini isterler ve muhtemelen düzenlemeyi tamamladığınız olayı yükseltmek için bir düğme veya başka bir giriş aracı sağlamanızı beklerler.

Aynı sorunu yaşıyorum ve bariz çözümüm basitçe bir bitti düğmesi eklemek ve enter düğmesinin yeni satırları eklemesine izin vermekti.


Maalesef sorumu yeterince açıklayamamış olabilirim .. çoklu satırlar tek satırlık bir girişi yumuşak kaydırmak içindir. yani yeni satır karakterlerine izin verilmez.
ohhorob

@Mullins: SoftInput Klavyesine kendi "bitti" düğmenizi eklediniz mi? "Enter" tuşunu basılı tutarken bunu nasıl yaptın?
alex.veprik

Hayır! Kullanıcı arayüzünde klavyeden ayrı bir tamam düğmesi oluşturdum.
Mullins

1
Belki de Android ekibi kendi tavsiyelerini takip etmeli ve mesajlaşma uygulamasındaki çok satırlı TextEdit'in işlem düğmesini mesajı göndermek yerine yeni satırlar oluşturmalıdır.
Timmmm

0

Bu özniteliği XML'nizde kullanın.

android: inputType = "textImeMultiLine"

android: imeOptions = "actionDone"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.