Son Düzenleme Metninde klavyede Bitti'ye bastıktan sonra örtük "Gönder"


99

Kullanıcı adımı doldurup ardından parolama gittiğimde, klavyede "Bitti" ye bastığımda giriş formunun otomatik olarak gönder düğmesine tıklamama gerek kalmadan gönderildiği bazı uygulamaları kullandım. Bu nasıl yapılır?


Bu bağlantı yanıtını deneyin ... klavyenin
tamam

Dokümanlara hızlı bağlantı: Giriş Yöntemi Eylemini Belirtin
FirstOne

Yanıtlar:


191

Bunu dene:

Düzeninize şunu koyun / düzenleyin:

<EditText
    android:id="@+id/search_edit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="text"
    android:singleLine="true"
    android:imeOptions="actionDone" />

Aktivitenize şunu yazın (örneğin onCreate'e):

 // your text box
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });

submit_btnOnclick işleyiciniz eklenmiş olarak gönder düğmeniz nerede .


15
submit_btn.performClick();gözlerimi yakıyor Srsly? Neden gönderme yöntemini çağırmıyorsunuz?
Laurent Meyer

28
@LaurentMeyer Kullanıcı girdisini simüle etmek genellikle bu durumlarda temeldeki mantığı doğrudan çağırmaktan daha iyidir. Örneğin, gönder düğmesi şu anda devre dışı bırakılmış olabilir, bu nedenle performClick () hiçbir şey yapmaz (amaçlandığı gibi), ancak gönderme yöntemini doğrudan çağırdıysanız, önce düğmenin devre dışı bırakılıp bırakılmadığını kontrol etmeniz gerekir. Aynı zamanda "tıklama" sesini, sanki düğmeye
basılmış

3
@LaurentMeyer UI duyarlı derken neyi kastediyorsunuz? Ve son 6 ayda 5 kişi tabii. Onlara zaman verin ve insanlar muhtemelen benimle aynı fikirde olacak. ;)
Extragorey

Düğmeyi başka bir şey için kullanan kullanıcı arayüzünü değiştirdiğinizi düşünelim. Kod gerçek bir karmaşa olacak ve daha da kötüsü, bu tür bir hatayı tespit etmek için gerçekten kapsamlı test prosedürlerine sahip olmanız gerekir. Daha da kötüsü, UI bileşenini bu tür uygulamalarla paylaştığınızda.
Laurent Meyer

2
TWIMC, EditText'imde kullanmak imeActionLabeltüm bu davranışı devre dışı bırakıyordu. Dikkat edin
Alwin Kesler

25

IME Seçeneklerini cihazınızda ayarlamanız gerekir EditText.

<EditText
    android:id="@+id/some_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Whatever"
    android:inputType="text"
    android:imeOptions="actionDone" />

Daha sonra OnEditorActionListener, "tamamlandı" eylemini dinlemek için görünüme bir ekleyin .

EditText editText = (EditText) findViewById(R.id.some_view);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // TODO do something
            handled = true;
        }
        return handled;
    }
});

Resmi API belgesi: https://developer.android.com/guide/topics/ui/controls/text.html#ActionEvent


22

Kotlin ile basit ve etkili çözüm

Uzatın EditText:

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->

       if (actionId == EditorInfo.IME_ACTION_DONE) {
           func()
       }

       true

    }
}

Ardından yeni yöntemi şu şekilde kullanın:

editText.onSubmit { submit() }

submit()Böyle bir şey nerede :

fun submit() {
    // call to api
}

Daha genel uzantı

fun EditText.on(actionId: Int, func: () -> Unit) {
    setOnEditorActionListener { _, receivedActionId, _ ->

       if (actionId == receivedActionId) {
           func()
       }

        true
    }
}

Ardından, etkinliğinizi dinlemek için kullanabilirsiniz:

email.on(EditorInfo.IME_ACTION_NEXT, { confirm() })

6

Bu nasıl yapılır

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

Aşağıdakileri eklemeyi unutmayın

<EditText android:layout_height="wrap_content"

    android:layout_width="wrap_content"

    android:imeOptions="actionDone"/>

EditText'inizde actionDone.


2

XML dosyanızda edittext etiketinizin içine aşağıdaki snippet'i ekleyin

android:imeOptions="actionDone"

Sonra Java sınıfınızın içine aşağıdaki kodu yazın

editText.setOnEditorActionListener(new EditText.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int id, KeyEvent event) { 
        if (id == EditorInfo.IME_ACTION_DONE) { 
            //do something here 
            return true;
        }
        return false; 
    } 
});

1

edittext'e aşağıdaki satırı ekleyin

android:imeOptions="actionDone"

Mutlu kodlama


1
etParola = (EditText) findViewById(R.id.etParola); 
 btnGiris = (Button) findViewById(R.id.btnGiris);
  etParola.setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    btnGiris.performClick();
                    return true;
                }
                return false;
            }
        });

 and;


layout xml etParola
android:imeOptions="actionDone" add

Gibi bu tam olarak aynı cevabı bu bir . Bunun OP'nin problemini nasıl çözeceğini düşündüğünüzü biraz açıklamalısınız.
Adrian W

1

Sadece bu cevabı uzat

fun EditText.onSubmit(func: () -> Unit) {
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            clearFocus() // if needed 
            hideKeyboard()
            func()
        }
        true
    }
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

0
 EditText edit_txt = (EditText) findViewById(R.id.search_edit);

 edit_txt.setOnEditorActionListener(new EditText.OnEditorActionListener() {
     @Override
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
// which is u had set a imeoption
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             submit_btn.performClick();
             return true;
         }
         return false;
     }
 });

0
<EditText
    android:id="@+id/signinscr_userName"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/userName"
    android:imeOptions="actionNext" />

<EditText
    android:id="@+id/signinscr_password"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/password"
    android:imeOptions="actionDone"
    android:inputType="textPassword" />

java dosyasında

EditText userNameField = (EditText) findViewById(R.id.signinscr_userName);
EditText passwordField = (EditText) findViewById(R.id.signinscr_password);

passwordField.setOnEditorActionListener(new OnEditorActionListener() {
    public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
        //Do your operation here.
        return false;
    }
});
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.