Android - EditText'te “Enter” tuşunu kullanın


459

OnSubmit HTML olayı gibi Enterbir EditTextşey yazarken kullanıcı basarak işlemek için bir yol olup olmadığını merak ediyorum .

Ayrıca, sanal klavyeyi "Bitti" düğmesi başka bir şey (örneğin, "Git") olarak etiketlenecek ve tıklandığında belirli bir eylem gerçekleştirecek şekilde (yine, onSubmit gibi) manipüle etmenin bir yolu olup olmadığını merak ediyor.


1
Kotlin ve Uzantıları: buraya bir göz atın: stackoverflow.com/a/48810268/1912924
Francesco Donzello

Yanıtlar:


374

EnterBir EditText, onSubmit HTML olayı gibi bir şey yazarken kullanıcı basarak işlemek için bir yol olup olmadığını merak ediyorum .

Evet.

Ayrıca, sanal klavyeyi "Bitti" düğmesi başka bir şey (örneğin, "Git") olarak etiketlenecek ve tıklandığında belirli bir eylem gerçekleştirecek şekilde (yine, onSubmit gibi) manipüle etmenin bir yolu olup olmadığını merak ediyor.

Ayrıca evet.

android:imeActionIdVe android:imeOptionsözelliklerine ve ayrıca setOnEditorActionListener()yönteme bakmak isteyeceksiniz .TextView .

"Bitti" düğmesinin metnini özel bir dizeye değiştirmek için şunu kullanın:

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

26
(PS EditText TextView'i genişletiyor, bu yüzden bakmanız gereken özellikler neden TextView'de - bu son cümleyi ilk kez okuduğumda çift aldım :))
Ricket

15
Not olarak. Tüm klavyeler standart android: imeOptions özelliğini desteklemez. Bu gerçekten hayal kırıklığı yaratıyor. Örneğin, IME_ACTION_DONE 6 olarak tanımlanır, burada HTC varsayılan klavyesi (Incredible, Evo 4G gibi telefonlarda) dönüş tuşu 0 olarak tanımlanır.
fernferret

13
Ayrıca imeOptions kullanarak inputType = "text" veya başka bir eşdeğerini kullandığınızdan emin olursanız. Klavyenin sizi dinlediğinden emin olmak için! Nexus1
Blundell

6
"Evet" - Bundan daha açıklayıcı olur muydunuz? Muhtemelen çözümü nasıl uygulayacağını soracaktır.
Al Wang

5
@AlWang: İlk olarak, endişe duyduğunuz alan cevapta ele alınmıştır (bkz. "Yapmak isteyeceksiniz ..."). İkincisi, bu cevap altı yıl önceydi ve bu yüzden OP'nin sorununun çözüldüğünü varsayalım. Sonuçta, OP cevabı kabul etti.
CommonsWare

267
final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // If the event is a key-down event on the "enter" button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER)) {
          // Perform action on key press
          Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
          return true;
        }
        return false;
    }
});

1
Herhangi bir nedenle enterdüzenleme metnimi tıkladığımda , düzenleme metninin tamamı aşağı doğru hareket ediyor ... Bunu nasıl düzeltebilirim?
Ruchir Baronia

1
@RuchirBaronia Android: maxLines = "1" öğesini EditText'inize ekleyin. EditText'iniz "aşağı doğru ilerlemez", girilen metne satır sonu ekler. MaxLines değerini 1 olarak ayarlamak, satır kesmesinin eklenmesini önler.
lustig

3
Bu çözüm yalnızca yumuşak / sanal klavye için DEĞİL donanım klavyeleri için geçerlidir. Buna güvenirseniz, uygulamanız klavyesi olmayan kullanıcılar için bozulur.
user3562927

12
CommonsWare ama onun KKO cevap Darılma oldu yolu nasıl yapılacağını tam olarak gösteren bu basit örnekte daha az yararlı. Teşekkür ederim!
AutonomousApps

1
@AutonomousApps, sık sık CommonsWare cevapları görüyorum. Android başladığından beri 2009'dan beri cevap verdi. Genellikle "evet", "hayır", "imkansız" vb. Genellikle kodsuzdur. Çoğu zaman cevapları şimdi modası geçmiş, bu yüzden tavsiyelerine uymamaya çalışıyorum.
CoolMind

215

İşte yaptıklarınız. Ayrıca Android Geliştiricisinin örnek kodu 'Bluetooth Sohbeti'nde gizlidir. "Örnek" yazan kalın parçaları kendi değişkenleriniz ve yöntemlerinizle değiştirin.

İlk olarak, geri dönüş düğmesinin özel bir şey yapmasını istediğiniz ana Etkinliğe ihtiyacınız olanı içe aktarın:

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

Şimdi, dönüş anahtarınız için TextView.OnEditorActionListener türünde bir değişken yapın (burada exampleListener kullanıyorum );

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

Daha sonra dinleyiciye, geri dönüş düğmesine basıldığında ne yapılacağı hakkında iki şey söylemeniz gerekir. Ne EditText hakkında konuştuğumuzu bilmeliyiz (burada exampleView kullanıyorum ) ve ardından Enter tuşuna basıldığında ne yapılacağını bilmelidir (burada, example_confirm () ). Bu, Etkinliğinizdeki son veya tek EditText ise, Gönder (veya Tamam, Onayla, Gönder, Kaydet vb.) Düğmeniz için onClick yöntemiyle aynı işlemi yapmalıdır.

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

Son olarak, dinleyiciyi ayarlayın (büyük olasılıkla onCreate yönteminizde);

exampleView.setOnEditorActionListener(exampleListener);

20
Güzel, EditorInfo.IME_ACTION_SEND kullandım ve XML'de android: imeOptions = "actionSend" var.
Bani

EditorInfo.IME_ACTION_SEND'ın benim için hiçbir etkisi olmadı (öykünücü), bu nedenle kusursuz bir tetikleyici olarak KeyEvent.KEYCODE_ENTER'ı da aradım. Buraya bakın: stackoverflow.com/questions/2004344/…
Birisi

4
İşlem yapmak genellikle daha iyidir KeyEvent.ACTION_UP. İşe Bunun için, öncelikle tüketmek gerekir ACTION_DOWNolayı: if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { return true; }. Sonra ACTION_UPolayı kontrol edebilir ve eylemi gerçekleştirebilirsiniz (yukarıdaki cevaba benzer). ACTION_DOWNEtkinliği tüketmezseniz, onEditorActionçağrı yapılmaz ACTION_UP.
ashughes

2
Benim için işe yarayan buydu: if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {...}- diğer çalışma yaklaşımlarından hiçbirini alamadım
Jonathan Ellis

39

Donanım klavyeleri her zaman enter olayları verir, ancak yazılım klavyeleri singleLine EditTexts'te farklı actionID'ler ve null'lar döndürür. Bu kod, kullanıcının EditText veya klavye türünden bağımsız olarak bu dinleyicinin ayarlandığı bir EditText'e her basışında yanıt verir.

import android.view.inputmethod.EditorInfo;
import android.view.KeyEvent;
import android.widget.TextView.OnEditorActionListener;

listener=new TextView.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (event==null) {
      if (actionId==EditorInfo.IME_ACTION_DONE);
      // Capture soft enters in a singleLine EditText that is the last EditText.
      else if (actionId==EditorInfo.IME_ACTION_NEXT);
      // Capture soft enters in other singleLine EditTexts
      else return false;  // Let system handle all other null KeyEvents
    }
    else if (actionId==EditorInfo.IME_NULL) { 
    // Capture most soft enters in multi-line EditTexts and all hard enters.
    // They supply a zero actionId and a valid KeyEvent rather than
    // a non-zero actionId and a null event like the previous cases.
      if (event.getAction()==KeyEvent.ACTION_DOWN); 
      // We capture the event when key is first pressed.
      else  return true;   // We consume the event when the key is released.  
    }
    else  return false; 
    // We let the system handle it when the listener
    // is triggered by something that wasn't an enter.


    // Code from this point on will execute whenever the user
    // presses enter in an attached view, regardless of position, 
    // keyboard, or singleLine status.

    if (view==multiLineEditText)  multiLineEditText.setText("You pressed enter");
    if (view==singleLineEditText)  singleLineEditText.setText("You pressed next");
    if (view==lastSingleLineEditText)  lastSingleLineEditText.setText("You pressed done");
    return true;   // Consume the event
  }
};

SingleLine = false içindeki enter tuşunun varsayılan görünümü, eğilmiş bir ok tuş takımına girmenizi sağlar. Son EditText'te singleLine = true olduğunda anahtar DONE (DONE) ve EditTexts'ten önce NEXT (SONRAKİ) yazar. Varsayılan olarak, bu davranış tüm vanilya, android ve google emülatörlerinde tutarlıdır. ScrollHorizontal özelliği herhangi bir fark yaratmaz. Null testi önemlidir, çünkü telefonların yumuşak girişlere yanıtı üreticiye bırakılır ve emülatörlerde bile, vanilya Seviye 16 emülatörleri çok satırlı ve kaydırmalı uzun yumuşak girişlere yanıt verir. olay.


Java'yı yükselttiğimde Android araç zincirim kırıldı. 32 bitti. Her şeyi 64 bit yeniden yükledim ve şimdi daha fazla halka açık öykünücü sürümü olduğunu keşfettim. Sadece EditorActionListener'ın davranışının test ettiğim emülatörlerde tutarlı olduğunu bildiğimi itiraf etmeliyim.
earlcasper

Bunu bloguma gönderdiğimde, birisi tutulması üzerinde çalışmasını sağlamak için android: imeOptions = ”actionGo” ekleyerek varsayılan ime eylemini değiştirmeniz gerektiğini söyledi.
earlcasper

Hata! Blog yazımdaki yorumu yanlış okudum. Tutulma üzerinde çalışmasını sağlamak için android ekleyerek varsayılan ime eylemini değiştirmeniz gerekir: imeOptions = ”actionGo”. xml düzenindeki 'EditText' öğesine gidin.
earlcasper

Daha fazla yansıma üzerine benim son yorum hem Ant hem de Eclipse
earlcasper

27

Bu sayfada bunun nasıl yapılacağı açıklanmaktadır.

https://developer.android.com/training/keyboard-input/style.html

Android: imeOptions ayarlayın sonra sadece onEditorAction içinde actionId kontrol edin . Dolayısıyla, imeOptions öğesini 'actionDone' olarak ayarlarsanız, onEditorAction'da 'actionId == EditorInfo.IME_ACTION_DONE' öğesini kontrol edersiniz. Ayrıca, android: inputType ayarını yaptığınızdan emin olun.

Yukarıda bağlantılı örnekteki EditText'i aşağıda bulabilirsiniz:

<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

Bunu setImeOptions (int) işlevini kullanarak da programlı olarak ayarlayabilirsiniz . Yukarıda bağlantılı örnekten OnEditorActionListener şunlardır:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

21

Bunun bir yaşında olduğunu biliyorum, ama bunun bir EditText için mükemmel çalıştığını keşfettim.

EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);

Metin ve boşluk dışında her şeyi engeller. Sekme, "dönüş" ("\ n") veya başka bir şey yapamadım.


IME_ACTION_DONE
htafoya

1
"Enter" tuşunu devre dışı bırakmak istiyorsanız mükemmel şekilde çalışır.
deeJ

16

Chad'in yanıtına bir ek olarak (ki bu benim için neredeyse mükemmel çalıştı), kodumun iki kez (bir kez tuşa ve bir kez tuşa basma) yürütülmesini önlemek için KeyEvent eylem türüne bir kontrol eklemem gerektiğini buldum Etkinlik).

if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)
{
    // your code here
}

Tekrarlanan eylem olayları (enter tuşunu basılı tutarak) vb. Hakkında bilgi için http://developer.android.com/reference/android/view/KeyEvent.html adresine bakın .


16

Benzer bir amacım vardı. Ben TextView genişleten bir AutoCompleteTextView (ki ben özelleştirmek istedim) klavyede "Enter" tuşuna basarak çözmek istedim. Yukarıdakilerden farklı çözümler denedim ve işe yarıyor gibi görünüyordu. AMA cihazımdaki giriş türünü (AOKP ROM'lu Nexus 4) SwiftKey 3'ten (mükemmel çalıştı) standart Android klavyeye (kodumu dinleyiciden tutmak yerine yeni bir satır olarak değiştirdiğimde) bazı sorunlar yaşadım "Enter" tuşuna bastıktan sonra girildi.Bu sorunun üstesinden gelmek biraz zaman aldı, ancak hangi giriş türünü kullanırsanız kullanın her koşulda çalışıp çalışmayacağını bilmiyorum.

İşte benim çözümüm:

Xml dosyasındaki TextView öğesinin girdi türü niteliğini "text" olarak ayarlayın:

android:inputType="text"

Klavyedeki "Enter" tuşunun etiketini özelleştirin:

myTextView.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

TextView için bir OnEditorActionListener ayarlayın:

myTextView.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event)
    {
    boolean handled = false;
    if (event.getAction() == KeyEvent.KEYCODE_ENTER)
    {
        // Handle pressing "Enter" key here

        handled = true;
    }
    return handled;
    }
});

Umarım bu, başkalarının sahip olduğum problemlerden kaçınmasına yardımcı olabilir, çünkü neredeyse beni deli ediyorlardı.


Ne yazık ki bu, SwiftKey'in yeni sürümü 4 ile çalışmıyor. Ve yine beni deli ediyor ...: - /
kaolick

3
IF'niz yanlış. kullanın: 'event.getKeyCode () == KeyEvent.KEYCODE_ENTER'
Loda

Benim için mükemmel. Ayrıca setImeActionLabel öğesini IF deyimine tekrar eklemeyi unutmayın, aksi takdirde ilk basıştan sonra özel metin kaybolur.
Steve Rogers

IF'si doğrudur, çünkü actionId öğesini yukarıdaki KeyEvent.KEYCODE_ENTER olarak ayarlar :-D, ancak evet herkes muhtemelen event.getKeyCode () ==
KeyEvent.KEYCODE_ENTER

15

Xml'nizde, editText'e imeOptions özniteliğini ekleyin

<EditText
    android:id="@+id/edittext_additem"
    ...
    android:imeOptions="actionDone"
    />

Ardından, Java kodunuzda OnEditorActionListener'ı aynı EditText'e ekleyin

mAddItemEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(actionId == EditorInfo.IME_ACTION_DONE){
                //do stuff
                return true;
            }
            return false;
        }
    });

İşte imeOptions = actionDone ifadesi EnterKey'e "actionDone" atayacaktır. Klavyedeki EnterKey tuşu "Enter" dan "Done" a değişir. Enter Tuşuna basıldığında, bu eylemi tetikleyecek ve böylece işlemi gerçekleştireceksiniz.


9

Ayrıca yapabilirsiniz ..

editText.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getKeyCode() ==       KeyEvent.KEYCODE_ENTER) 
                {
                    Log.i("event", "captured");

                    return false;
                } 

            return false;
        }
    });

Herhangi bir nedenle enterdüzenleme metnimi tıkladığımda , düzenleme metninin tamamı aşağı doğru hareket ediyor ... Bunu nasıl düzeltebilirim?
Ruchir Baronia

Sanırım öğrenmek istiyorum stackoverflow.com/questions/10978038/… othewise bana xml göstermek
Zar E Ahmer

6
     password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                submit.performClick();
                return true;
            }
            return false;
        }
    });

Benim için çok iyi çalışıyor
Ayrıca klavyeyi gizle


5

İlk olarak, EditText tuş basışını dinleyecek şekilde ayarlamanız gerekir

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 

    // Set the EditText listens to key press
    EditText edittextproductnumber = (EditText) findViewById(R.id.editTextproductnumber);
    edittextproductnumber.setOnKeyListener(this);

}

İkinci olarak, tuşuna basıldığında olayı tanımlayın, örneğin TextView metnini ayarlamak için olay:

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

 // Listen to "Enter" key press
 if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
 {
     TextView textviewmessage = (TextView) findViewById(R.id.textViewmessage);
     textviewmessage.setText("You hit 'Enter' key");
     return true;
 }

return false;   

}

Ve son olarak, EditText, TextView, OnKeyListener, KeyEvent'i en üste aktarmayı unutmayın:

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;

5

mükemmel çalışmak

public class MainActivity extends AppCompatActivity {  
TextView t;
Button b;
EditText e;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    b = (Button) findViewById(R.id.b);
    e = (EditText) findViewById(R.id.e);

    e.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            if (before == 0 && count == 1 && s.charAt(start) == '\n') {

                b.performClick();
                e.getText().replace(start, start + 1, ""); //remove the <enter>
            }

        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void afterTextChanged(Editable s) {}
    });

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            b.setText("ok");

        }
    });
}

}

mükemmel çalışmak


5
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId != 0 || event.getAction() == KeyEvent.ACTION_DOWN) {
                // Action
                return true;
            } else {
                return false;
            }
        }
    });

xml

<EditText
        android:id="@+id/editText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionGo|flagNoFullscreen"
        android:inputType="textPassword"
        android:maxLines="1" />

4

Bu çalışmalı

input.addTextChangedListener(new TextWatcher() {

           @Override
           public void afterTextChanged(Editable s) {}

           @Override    
           public void beforeTextChanged(CharSequence s, int start,
             int count, int after) {
           }

           @Override    
           public void onTextChanged(CharSequence s, int start,
             int before, int count) {
               if( -1 != input.getText().toString().indexOf( "\n" ) ){
                   input.setText("Enter was pressed!");
                    }
           }
          });

4

Gerekli kodları içe aktarabilmesi için bu kodu düzenleyicinize yazın.

 query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if(actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                        || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {

                // Put your function here ---!

                return true;

            }
            return false;
        }
    });

query = EditText alanının adı ve bunu -> (android: imeOptions = "actionSearch") xml EditText'e ekleyin.
Sanjit Prasad

3

Bu LG Android telefonlarda iyi çalışıyor. ENTERDiğer karakterlerin normal karakter olarak yorumlanmasını engeller . Nextveya Donedüğmesi otomatik olarak görünür ve ENTERbeklendiği gibi çalışır.

edit.setInputType(InputType.TYPE_CLASS_TEXT);

Bu benim için işe yarayan tek şeydi. Bir Motorola Moto X 2 var ve normalde ok ve her şeyi ile bir "Dönüş" tuşu var. Bu onu bir onay işaretine dönüştürdü ve sonunda dinleyicinin bununla çalışmasını sağlayabildim. (Yeni bir satır oluşturmadan önce). Yani başka birisi bu problemi yaşıyorsa ...
mistik kola

2

Burada , kullanıcı bir donanım veya yazılım klavyesinde dönüş tuşuna bastığında kodunuzu yürütecek olan Utilsveya Keyboardssınıfınıza atabileceğiniz basit bir statik işlev bulunmaktadır . @ Earlcasper'ın mükemmel cevabının değiştirilmiş bir versiyonu

 /**
 * Return a TextView.OnEditorActionListener that will execute code when an enter is pressed on
 * the keyboard.<br>
 * <code>
 *     myTextView.setOnEditorActionListener(Keyboards.onEnterEditorActionListener(new Runnable()->{
 *         Toast.makeText(context,"Enter Pressed",Toast.LENGTH_SHORT).show();
 *     }));
 * </code>
 * @param doOnEnter A Runnable for what to do when the user hits enter
 * @return the TextView.OnEditorActionListener
 */
public static TextView.OnEditorActionListener onEnterEditorActionListener(final Runnable doOnEnter){
    return (__, actionId, event) -> {
        if (event==null) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // Capture soft enters in a singleLine EditText that is the last EditText.
                doOnEnter.run();
                return true;
            } else if (actionId==EditorInfo.IME_ACTION_NEXT) {
                // Capture soft enters in other singleLine EditTexts
                doOnEnter.run();
                return true;
            } else {
                return false;  // Let system handle all other null KeyEvents
            }
        } else if (actionId==EditorInfo.IME_NULL) {
            // Capture most soft enters in multi-line EditTexts and all hard enters.
            // They supply a zero actionId and a valid KeyEvent rather than
            // a non-zero actionId and a null event like the previous cases.
            if (event.getAction()==KeyEvent.ACTION_DOWN) {
                // We capture the event when key is first pressed.
                return true;
            } else {
                doOnEnter.run();
                return true;   // We consume the event when the key is released.
            }
        } else {
            // We let the system handle it when the listener
            // is triggered by something that wasn't an enter.
            return false;
        }
    };
}

Bunun Java 1.8 gerektiren bir lambda ifadesi kullandığını, ancak lambda kullanmamak için dönüştürmenin yeterince kolay olduğunu unutmayın. Ancak, bu tür çözümlerde gördüğüm sorun, sanal klavyenin otomatik olarak gizlenmemesi ve tam ekran modunda (yatay yönde küçük cihaz), kullanıcı Enter veya DONE
düğmesine bastıktan

2

textCommonsWare'in çalışması için metin alanındaki InputType olmalıdır . Sadece hepsini denedim, deneme öncesi hiçbir girdiTürü ve hiçbir şey işe yaramadı, Enter yumuşak giriş olarak kaydetmeye devam etti. Sonra inputType = textsetImeLabel dahil her şey çalıştı.

Misal : android:inputType="text"


2
   final EditText edittext = (EditText) findViewById(R.id.edittext);
    edittext.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
                // Perform action on key press
                Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

1

EditText'te bir <enter> öğesine yanıt vermenin güvenilir bir yolu TextWatcher , LocalBroadcastManager ve BroadcastReceiver'dır . LocalBroadcastManager'ı kullanmak için v4 destek kitaplığını eklemeniz gerekir . Ben vogella.com adresindeki öğretici kullanın : 7.3 "Özlü kod örneği nedeniyle" LocalBroadcastManager ile yerel yayın olayları ". OnTextChanged önce , değişiklik >; eksi başlamadan önceki değişikliğin sonunun dizinidir . TextWatcher'da UI iş parçacığı editText'in düzenlenebilirini güncellemekle meşgulken, UI iş parçacığı editText'i güncellemeyi tamamladığında BroadcastReceiver'ı uyandırmak için bir Niyet göndeririz.

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.Editable;
//in onCreate:
editText.addTextChangedListener(new TextWatcher() {
  public void onTextChanged
  (CharSequence s, int start, int before, int count) {
    //check if exactly one char was added and it was an <enter>
    if (before==0 && count==1 && s.charAt(start)=='\n') {
    Intent intent=new Intent("enter")
    Integer startInteger=new Integer(start);
    intent.putExtra("Start", startInteger.toString()); // Add data
    mySendBroadcast(intent);
//in the BroadcastReceiver's onReceive:
int start=Integer.parseInt(intent.getStringExtra("Start"));
editText.getText().replace(start, start+1,""); //remove the <enter>
//respond to the <enter> here

Metin * giriş türlerinden herhangi biri (örn. android:inputType="textCapSentences") Kullanılıyorsa, satırbaşı değerleri girişten filtrelenir, böylece kullanıcı Enter tuşuna bastığında onTextChanged () çağrılmaz.
jk7

1

Bu soru henüz yanıtlanmamış.

DÜZEN XML

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/some_input_hint">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/textinput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionSend"
            android:inputType="text|textCapSentences|textAutoComplete|textAutoCorrect"/>
    </android.support.design.widget.TextInputLayout>

JAVA UYGULAMASI

@OnEditorAction(R.id.textinput)
boolean onEditorAction(int actionId, KeyEvent key){
    boolean handled = false;
    if (actionId == EditorInfo.IME_ACTION_SEND || (key.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
        //do whatever you want
        handled = true;
    }
    return handled;
}

TextInputLayout ve Butterknife: KAZAN!
Javi

1

Kotlin'i kullanarak, klavye de dahil olmak üzere EditText için her türlü "tamamlanmış" gibi eylemleri gerçekleştiren bir işlev yaptım ve bunu değiştirmek ve diğer tuşları da istediğiniz gibi işlemek mümkündür:

private val DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(EditorInfo.IME_ACTION_SEND, EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_DONE)
private val DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT = arrayListOf(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_NUMPAD_ENTER)

fun EditText.setOnDoneListener(function: () -> Unit, onKeyListener: OnKeyListener? = null, onEditorActionListener: TextView.OnEditorActionListener? = null,
                               actionsToHandle: Collection<Int> = DEFAULT_ACTIONS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT,
                               keysToHandle: Collection<Int> = DEFAULT_KEYS_TO_HANDLE_AS_DONE_FOR_EDIT_TEXT) {
    setOnEditorActionListener { v, actionId, event ->
        if (onEditorActionListener?.onEditorAction(v, actionId, event) == true)
            return@setOnEditorActionListener true
        if (actionsToHandle.contains(actionId)) {
            function.invoke()
            return@setOnEditorActionListener true
        }
        return@setOnEditorActionListener false
    }
    setOnKeyListener { v, keyCode, event ->
        if (onKeyListener?.onKey(v, keyCode, event) == true)
            return@setOnKeyListener true
        if (event.action == KeyEvent.ACTION_DOWN && keysToHandle.contains(keyCode)) {
            function.invoke()
            return@setOnKeyListener true
        }
        return@setOnKeyListener false
    }
}

Yani, örnek kullanımı:

        editText.setOnDoneListener({
            //do something
        })

Etiketi değiştirmeye gelince, klavye uygulamasına bağlı olduğunu ve burada yazıldığı gibi genellikle yalnızca manzaraya değiştiğini düşünüyorum . Her neyse, bunun için örnek kullanım:

        editText.imeOptions = EditorInfo.IME_ACTION_DONE
        editText.setImeActionLabel("ASD", editText.imeOptions)

Veya XML'de isterseniz:

    <EditText
        android:id="@+id/editText" android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:imeActionLabel="ZZZ" android:imeOptions="actionDone" />

Ve sonuç (manzarada gösterilir):

resim açıklamasını buraya girin


0

Bu bağımlılığı ekleyin, işe yarayacaktır:

import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;

0

Bu, kullanıcı dönüş tuşuna bastığında size çağrılabilir bir işlev verecektir.

fun EditText.setLineBreakListener(onLineBreak: () -> Unit) {
    val lineBreak = "\n"
    doOnTextChanged { text, _, _, _ ->
        val currentText = text.toString()

        // Check if text contains a line break
        if (currentText.contains(lineBreak)) {

            // Uncommenting the lines below will remove the line break from the string
            // and set the cursor back to the end of the line

            // val cleanedString = currentText.replace(lineBreak, "")
            // setText(cleanedString)
            // setSelection(cleanedString.length)

            onLineBreak()
        }
    }
}

kullanım

editText.setLineBreakListener {
    doSomething()
}
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.