EditText'in odağı ne zaman kaybettiğini nasıl bilebilirim?


163

Bir zaman yakalamak için gereken EditTextdiğer sorular aradık ama bir cevap bulamadık odağı kaybeder.

OnFocusChangeListenerBöyle kullandım

OnFocusChangeListener foco = new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        // TODO Auto-generated method stub

    }
};

Ama benim için işe yaramıyor.

Yanıtlar:


344

Uygulamak onFocusChangearasında setOnFocusChangeListenerve hasFocus için bir boolean parametre var. Bu yanlış olduğunda, başka bir kontrole odaklanmayı kaybettiniz.

 EditText txtEdit = (EditText) findViewById(R.id.edittxt);

 txtEdit.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
               // code to execute when EditText loses focus
            }
        }
    });

20
+1 - ancak düzenleme metniniz bir liste görünümündeyse, her tuşun aşağı bırakılması kutunun kaybolmasına ve odaklanmasına neden olacağını belirtmek gerekir. Şu anda odaklanmış kutuyu takip etmek için bu çözümü inceleyin: stackoverflow.com/questions/9527067/…
bsautner

Gösterdiğiniz kodu nereye eklerim? Ben "onCreate" olduğu gibi koyarsanız uygulama çöküyor
Jona

@ Léon Pelletier Gerçek mi? Gerçekten mi? Kullanıcı başka bir odaklanabilir kontrole dokunur ve editText kontrolünü kaybeder. Herhangi bir sorun göremiyorum. Odağı kodunuzla ayarlarsanız da aynı şey geçerlidir.
İnanılmaz

@Jona Herhangi bir yere ekleyebilirsiniz, ancak onCreate () çalışır. Eğer çökerse yanlış bir şey yaparsınız.
İnanılmaz

8

Senin var Activityuygulamak OnFocusChangeListener()bu arayüzün bir factorized kullanımını istiyorsanız, örnek:

public class Shops extends AppCompatActivity implements View.OnFocusChangeListener{

Örneğin, OnCreatebir dinleyici ekleyebilirsiniz:

editTextResearch.setOnFocusChangeListener(this);
editTextMyWords.setOnFocusChangeListener(this);
editTextPhone.setOnFocusChangeListener(this);

o zaman android studio, arabirimden yöntemi eklemenizi isteyecektir, kabul edin ... şöyle olacaktır:

@Override
public void onFocusChange(View v, boolean hasFocus) {
// todo your code here...
}

ve çarpanlarına ayrılmış bir kodunuz olduğundan, bunu yapmanız yeterlidir:

@Override
public void onFocusChange(View v, boolean hasFocus) {
   if (hasFocus) {
        editTextResearch.setText("");
        editTextMyWords.setText("");
        editTextPhone.setText("");
    }
    if (!hasFocus){
        editTextResearch.setText("BlaBlaBla");
        editTextMyWords.setText(" One Two Tree!");
        editTextPhone.setText("\"your phone here:\"");
    }
}

kodladığınız her şey !hasFocus, odaklanmayı kaybeden öğenin davranışı içindir, bu hile yapmalıdır! Ancak, bu durumda odak değişikliğinin kullanıcının girişlerinin üzerine yazılabileceğini unutmayın!


1
neden '! hasFocus' yerine 'else' kullanmıyorsunuz
Salman Nazir

O zaman, sadece işleri çok netleştirmek istedim, ama dediğim gibi, zaten olduğu gibi kullanışlı değil ...
Cerberus

7

Kotlin yolu

editText.setOnFocusChangeListener { _, hasFocus ->
    if (!hasFocus) {  }
}

1

Düzgün Çalışıyor

EditText et_mobile= (EditText) findViewById(R.id.edittxt);

et_mobile.setOnFocusChangeListener(new OnFocusChangeListener() {          
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus) {
            // code to execute when EditText loses focus
            if (et_mobile.getText().toString().trim().length() == 0) {
                CommonMethod.showAlert("Please enter name", FeedbackSubmtActivity.this);
            }
        }
    }
});



public static void showAlert(String message, Activity context) {

    final AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(message).setCancelable(false)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {

                }
            });
    try {
        builder.show();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

0

Java 8 lambda ifadesini kullanma:

editText.setOnFocusChangeListener((v, hasFocus) -> {
    if(!hasFocus) {
        String value = String.valueOf( editText.getText() );
    }        
});
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.