Odağı EditText'e Ayarlama


178

Bir EditText-alanı var ve bunun için bir OnFocusChangeListener ayarlayın. Odağı kaybettiğinde, EditText'in değerini veritabanındaki bir değerle kontrol eden bir yöntem çağrılır. Yöntemin dönüş değeri true olursa, bir tost gösterilir ve odağın EditText'e tekrar dönmesi gerekir. Odak her zaman EditText'e dönmeli ve yöntemin dönüş değeri yanlış olana kadar klavye gösterilmelidir.

DÜZENLEME: Sanırım, gerçek sorunumu henüz tam olarak açıklığa kavuşturmadım: Ekrandaki başka hiçbir Öğe, EditText değerinin "checkLiganame (liganame) yöntemini yapan bir değere düzenlenene kadar düzenleme yapamamalıdır. msgstr "yanlış döndür. Yalnızca EditText-Alanı düzenlenebilir olmalıdır.

İşte benim kod (benim için çalışmıyor):

final EditText Liganame = (EditText) findViewById(R.id.liganame);

    Liganame.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {

                String liganame = Liganame.getText().toString();


                if (checkLiganame(liganame)) {
                    Toast toast = Toast.makeText(CreateTableActivity.this,
                            "Dieser Liganame ist bereits vergeben",
                            Toast.LENGTH_SHORT);
                    toast.show();
                    Liganame.requestFocus();
                }
            }

ve yöntem:

public boolean checkLiganame(String liganame) {
    boolean found = false;

    DatabaseHelper databaseHelper = new DatabaseHelper(this);
    SQLiteDatabase db = databaseHelper.getReadableDatabase();

    Cursor cursor = db.query("liga", new String[] { "liganame" },
            "liganame = '" + liganame + "'", null, null, null, null);
    Log.i("Liganame: ", String.valueOf(cursor));

    db.close();
    if (cursor != null) {
        found = true;
    }

    return found;
}

Bu kod aşağıdaki sonuca yol açar: EditText odak kaybettikten sonra, odak EditText için geri atlar, ancak artık metin düzenleyemiyorum.

EDIT2: Kodumu değiştirdi. Senaryo:

İlk EditText tıklayın ve zaten veritabanında olan bir String koymak. Tost gösteriyor. Artık String'imi düzenleyemiyorum. Klavyede "ileri" yi tıklıyorum ve odak ilk EditText'te kalıyor. Dize düzenlemeye çalışıyorum, ama hiçbir şey olmuyor. Bunun yerine yeni String'im ikinci EditText'te gösteriliyor. Cihazımın geri okunu tıklıyorum ve birinci ve ikinci EditText'i tıklıyorum -> klavye gösterilmiyor.

İşte benim yeni Kod:

public class CreateTableActivity extends Activity implements
    OnFocusChangeListener {

private EditText Liganame, Mannschaftsanzahl;

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

    Liganame = (EditText) findViewById(R.id.liganame);
    Liganame.setOnFocusChangeListener(this);
    Mannschaftsanzahl = (EditText) findViewById(R.id.mannschaftsanzahl);
    Mannschaftsanzahl.setOnFocusChangeListener(this);

    final Button save_button = (Button) findViewById(R.id.create_tabelle_speichern_button);

    OnClickListener mCorkyListener = new OnClickListener() {
        public void onClick(View v) {
            ButtonClick();
        }
    };
    save_button.setOnClickListener(mCorkyListener);



}

@Override
public void onFocusChange(View v, boolean hasFocus) {
    String liganame = Liganame.getText().toString();

    if (checkLiganame(liganame)) {
        if (Liganame.requestFocus()) {
            getWindow()
                    .setSoftInputMode(
                            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            Mannschaftsanzahl.clearFocus();
            Toast.makeText(CreateTableActivity.this,
                    "Dieser Liganame ist bereits vergeben",
                    Toast.LENGTH_SHORT).show();
        }
    }
}

Aşağıdaki cevaplar size yardımcı oluyorsa, lütfen aşağıdaki cevaplardan birini kabul edin
Akshatha Srinivas

Yanıtlar:


278

Sadece bu satırı onCreate()

editText.requestFocus();

Benim için çalışıyor, umarım yardımcı olur


163

Odak istemek klavyeyi göstermek için yeterli değildir.

Odaklanmak ve klavyeyi göstermek için şöyle bir şey yazardınız:

if(myEditText.requestFocus()) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

DÜZENLEME: checkLiganame yöntemi eklendikten sonra yanıta fazladan bilgi ekleme.

CheckLiganame yönteminde, imlecin boş olup olmadığını kontrol edersiniz. İmleç her zaman bir nesne döndürür, bu nedenle null denetimi hiçbir şey yapmaz. Ancak sorun şu sıradadb.close();

Veritabanı bağlantısını kapattığınızda, Cursorgeçersiz olur ve büyük olasılıkla boştur.

Bu nedenle, değeri getirdikten sonra veritabanını kapatın.

İmleci null için kontrol etmek yerine, döndürülen satır sayısının 0'dan büyük olup olmadığını kontrol etmelisiniz: if (cursor.getCount ()> 0) ve ardından boolean'ınızı true olarak ayarlamalısınız.

EDIT2: İşte nasıl çalışması için bazı kod. EDIT3: Üzgünüm yanlış kod ekledim ...; S

Öncelikle, başka biri odaklanırsa odağı temizlemeniz gerekir EditText. Bu ile yapılabilir myEditText.clearFocus(). Daha sonra onFocusChangeListener'ınızda ilk EditTextodaklanıp odaklanmadığına gerçekten dikkat etmemelisiniz, böylece onFocusChangeListener şöyle görünebilir:

public class MainActivity extends Activity implements OnFocusChangeListener {
    private EditText editText1, editText2;

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

        editText1 = (EditText) findViewById(R.id.editText1);
        editText1.setOnFocusChangeListener(this);
        editText2 = (EditText) findViewById(R.id.editText2);
        editText2.setOnFocusChangeListener(this);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        String liganame = editText1.getText().toString();

        if(liganame.length() == 0) {
            if(editText1.requestFocus()) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                editText2.clearFocus();
                Toast.makeText(MainActivity.this, "Dieser Liganame ist bereits vergeben", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

İlk kontrolü if(liganame.length() == 0)kendi çekinizle değiştirin, ardından çalışmalıdır. Tüm EditText görünümlerinin onFocusChangeListenerörnekte yaptığım gibi aynı dinleyiciye ayarlanmış olması gerektiğini unutmayın .


Şimdiye kadar teşekkür ederim. Ama bu benim bütün sorunumu çözmedi. Sorunumun açıklamasını düzenledim.
erdalprinz

Peki checkLiganame tam olarak ne yapıyor? Neden sadece (liganame.isEmpty ()) öğesinin olup olmadığını ve doğru olup olmadığını kontrol edemiyor musunuz?
Darwind

1
Teşekkür ederim :-) Şimdi benim yöntem düzgün çalışıyor :-) ama EditText-Alan ile benim ana sorun henüz çözüldü değil. Yöntem bir satır bulduktan sonra hala düzenleyemiyorum ...
erdalprinz

Dolayısıyla, eğer (myEditText.requestFocus ()) {getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } OnFocusChanged dinleyicisinin içinde mi?
Ocak'ta Darwind

Evet yaptım. Liganame.requestFocus (); altında. Bir sonraki EditText-Alanına atlamak için klavyede "ileri" yi tıklıyorum. Tost gösteriliyor ve odak İKİ EditText-Alanları üzerinde. Ama sadece ikincisini düzenleyebilirim. Bu durumda odaklanan tek kişi olması gereken ilki artık düzenlenemez.
erdalprinz

59

Darwind kodu klavyeyi göstermedi.

Bu benim için çalışıyor:

        _searchText.requestFocus();
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT);

klavyenin gösterilmemesi durumunda zorlamaya çalışın:

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);

19

Bu, düğme tıklatıldığında EditText öğesinin odağını değiştirir:

public class MainActivity extends Activity {
    private EditText e1,e2;
    private Button b1,b2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        e1=(EditText) findViewById(R.id.editText1);
        e2=(EditText) findViewById(R.id.editText2);
        e1.requestFocus();
        b1=(Button) findViewById(R.id.one);
        b2=(Button) findViewById(R.id.two);
        b1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e1.requestFocus();

            }
        });
        b2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e2.requestFocus();
            }
        });
    }
}

16

Bu benden işe yarıyor:

public void showKeyboard(final EditText ettext){
    ettext.requestFocus();
    ettext.postDelayed(new Runnable(){
            @Override public void run(){
                InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                keyboard.showSoftInput(ettext,0);
            }
        }
        ,200);
}

Gizlemek için:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}

1
Neden 200 ms beklemeniz gerekiyor? gerekli mi yoksa hemen gösterebilir miyim?
Coder123

11

Bu benim için işe yarayan, odağı ayarlayan ve klavyeyi de gösteren

EditText userNameText = (EditText) findViewById(R.id.textViewUserNameText);
userNameText.setFocusable(true);
userNameText.setFocusableInTouchMode(true);
userNameText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(userNameText, InputMethodManager.SHOW_IMPLICIT);

1
Teşekkürler. setFocusableAPI 26 gerektirir. Ayrıca setFocusableInTouchModebenim durumumda gerekli değildi.
CoolMind

8

Dinamik olarak bir EditText oluşturursak, requestFocus () öğesini aşağıda verildiği gibi ayarlamamız gerekir.

    EditText editText = new EditText(this);
    editText.setWidth(600);
    editText.requestFocus();

Bileşeni zaten xml görünümünde ilan ettiysek, onu bulmalıyız ve aşağıda verilen şekilde odaklanabiliriz.

EditText e1=(EditText) findViewById(R.id.editText1);
e1.requestFocus();

Yalnızca karşılık gelen EditText bileşenine odaklanır.


6
    mEditText.setFocusableInTouchMode(true);
    mEditText.requestFocus();

    if(mEditText.requestFocus()) {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }

4
    Button btnClear = (Button) findViewById(R.id.btnClear);

    EditText editText1=(EditText) findViewById(R.id.editText2);
    EditText editText2=(EditText) findViewById(R.id.editText3);

    btnClear.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            editText1.setText("");
            editText2.setText("");

            editText1.requestFocus();
        }
    });

3
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);


2

Xamarin.Android için bu uzantıyı oluşturdum.

public static class ViewExtensions
{
    public static void FocusEditText(this EditText editText, Activity activity)
    {
        if (editText.RequestFocus())
        {
            InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService);
            imm.ShowSoftInput(editText, ShowFlags.Implicit);
        }
    }
}

2

lütfen manifest'te bu kodu deneyin

<activity android:name=".EditTextActivity" android:windowSoftInputMode="stateAlwaysVisible">
</activity>

2

requestFocus()Düzen şişirilmeden önce aramayı denerseniz , yanlış döndürür. Bu kod, düzen şişirildikten sonra çalışır. Yukarıda belirtildiği gibi 200 ms gecikmeye ihtiyacınız yoktur .

editText.post(Runnable {
   if(editText.requestFocus()) {
       val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
       imm?.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
   }
})

1

Alredy'nin bir çözüm bulduğunu bilmiyorum, ancak tekrar odaklanma talebinde bulunduktan sonra düzenleme sorunlarınız için:

Edittext1'inizde yöntemi selectAll()veya setSelection(0)(emtpy ise) çağırmayı denediniz mi?

Bu yardımcı olursa lütfen bana bildirin, bu yüzden tam bir çözüm için cevabımı düzenleyeceğim.


1
new OnEditorActionListener(){
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      editText.requestFocus();
      //used ******* return true ******
      return **true**;
   }
} 

0

Kullanılıyorsa requestFocus()içinde onCreate()klavyenin sorunu musluğu gösterilmiyor sunmakta, kullanın BindingAdapterbir kullanarak SingleLiveEvent ve içerde odağı talep ediyoruz.

Bunu nasıl yapacağınız aşağıda açıklanmıştır:

BindingAdapter

@BindingAdapter("requestFocus")
fun bindRequestFocus(editText: EditText, event: Event<Boolean>?) {
    event?.getContentIfNotHandled()?.let {
        if (it) editText.requestFocus()
    }
}

0

Cevabım burada

Resmi belgede okuduğumda, bunun en iyi cevap olduğunu düşünüyorum, Görünüm'ü EditText gibi parametreye geçirin, ancak showSoftKeyboard manzara üzerinde çalışmıyor gibi görünüyor

private fun showSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
    }
}

private fun closeSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}
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.