EditText'imde odağı nasıl programlayabilirim (ve klavyeyi görüntüleyebilirim)


180

Ben böyle bazı görünümleri içeren bir düzen var:

<LinearLayout>
<TextView...>
<TextView...>
<ImageView ...>
<EditText...>
<Button...>
</linearLayout>

EditTextProgramlamaya odaklanmayı (klavyeyi görüntüle) nasıl ayarlayabilirim ?

Bunu denedim ve sadece Activitynormalde başlattığımda çalışıyor , ancak bir 'de başlattığımda TabHostçalışmıyor.

txtSearch.setFocusableInTouchMode(true);
txtSearch.setFocusable(true);
txtSearch.requestFocus();


Yanıtlar:


353

Bunu dene:

EditText editText = (EditText) findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

http://developer.android.com/reference/android/view/View.html#requestFocus ()


Klavyeyi bu yanıttan göstermeye zorlamak için kodla güncellendi: stackoverflow.com/questions/5105354/…
David Merriman

5
yalnızca etkinliğimi normal olarak başlattığımda çalışır, ancak etkinliğimi TabHost'ta başlattığımda işe yaramaz,
Houcine

27
Bu işe yaramıyor. Bu benim için çalışıyor InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0);
Günay Gültekin

5
"Bu işe yaramaz kardeşim". Bazı durumlarda bu kodu postDelayed () öğesinden eşzamansız olarak çağırmanız gerekir. Kullanıcı iletişim kutusunda "Tamam" düğmesine bastıktan sonra klavyeyi açmak zorunda kaldığım bir durum vardı. Ve diyalog kapanırken odak ile uğraşıyordu. Bu yüzden postDelayed () yukarıdaki kodu çağırdım. İletişim kutusu kapatıldıktan sonra yürütüldü. Kar.
Danylo Volokh

2
237 cevap ve 62 oy "kardeş çalışmıyor" own Ben kendi görüş almak için test ve mükemmel çalışıyor!)
Daniel

165

kullanın:

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

20
5'ten fazla yaklaşımı denedikten sonra, bu benim için işe yarayan tek şeydi (bir Viewalt sınıftan)
William

13
Bu öneri, alan odağı kaybetse bile klavyenin sabitlenmesine yol açar.
e kadar

2
evet, benim için de işe yarıyor ve imm.showSoftInput()çalışmıyor.
Spark.Bao

8
Bu yöntem işe yararken, aşağı tarafı vardır, ana düğmeyle (donanım) uygulamadan çıkmak, klavyenin ekranda olmasına izin verir. Klavyeyi ana ekranınızda yararsız görmesini gizlemek için dönüş düğmesine (donanım) basmanız gerekir.
Adrien Horgnies

Diğer yaklaşımlar benim için işe yaramadı, bu işe yaradı. teşekkür ederim.
Iman Akbari

53

Bu benim için çalıştı, ungalcrys sayesinde

Klavyeyi göster:

editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);

Klavyeyi gizle:

InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

2
Tek tam çözüm. Teşekkürler.
korro

41

showSoftInput benim için hiç çalışmıyordu.

Giriş modunu ayarlamam gerektiğini düşündüm: android:windowSoftInputMode="stateVisible"(burada manifest'teki Activity bileşeninde)

Umarım bu yardım!


5
Bu, etkinlik başladığında klavyeyi gösterdi.
William

1
Harika :) Bir sürü cevap denedim ama sadece bununla, çalışmasını sağlayabilirim :) Çok teşekkür ederim.
Srikanth

çok yetersiz cevap
Avinash R

Mükemmel cevap. Yalnızca "editText.requestFocus ()" ile çalışır. Teşekkürler.
AVJ

37
final EditText tb = new EditText(this);
tb.requestFocus();
tb.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(tb, InputMethodManager.SHOW_IMPLICIT);
    }
}, 1000);

1
Bunu onResume () içinde göstermek için yapmak zorunda kaldı. Gecikme olmadan, bu iş parçacığında açıklanan her bir çözümü kullanarak hiçbir şey olmazdı.
FranticRock

1
İşte burada. Aradığım cevap buydu. Yine de, ikinci bir gecikmeye ihtiyacınız yoktur. Sadece 150 milis denedim ve bu da iyi çalıştı.
Rubberduck

1
Teşekkürler! Bu, 0 ms ( tb.post({ showKeyboard(tb) })) için bile çalışır . tbBir parça görünümüne değil, bir EditText görünümüne ( ) ihtiyacımız olduğuna dikkat edin .
CoolMind

16

Yumuşak klavyeyi göstermek ve gizlemek için bir kotlin uzantısı şu şekilde yapılabilir:

fun View.showKeyboard() {
  this.requestFocus()
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun View.hideKeyboard() {
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

O zaman bunu yapabilirsiniz:

editText.showKeyboard()
// OR
editText.hideKeyboard()

Bu dinlenme ile karşılaştırıldığında daha iyi bir çözüm
d-feverx

5

Ben kullanmanızı tavsiye LifecycleObserver parçası olan Yaşam Döngüsü-Aware Bileşenleri ile Handling Yaşam Döngüleri ait Android Jetpack .

Parça / Etkinlik görüntülendiğinde Klavyeyi açmak ve kapatmak istiyorum. İlk olarak, EditText için iki uzantı fonksiyonu tanımlayın . Onları projenizde herhangi bir yere koyabilirsiniz:

fun EditText.showKeyboard() {
    requestFocus()
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

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

Daha sonra açılır ve klavye Faaliyet / Fragman ulaştığı kapatan bir LifecycleObserver tanımlamak onResume()ya da onPause:

class EditTextKeyboardLifecycleObserver(private val editText: WeakReference<EditText>) :
    LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun openKeyboard() {
        editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 100)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun closeKeyboard() {
        editText.get()?.hideKeyboard()
    }
}

Sonra aşağıdaki satırı herhangi bir Fragmanı / Etkinliği ekleyin, LifecycleObserver'ı istediğiniz zaman yeniden kullanabilirsiniz. Örneğin bir Parça için:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    // inflate the Fragment layout

    lifecycle.addObserver(EditTextKeyboardLifecycleObserver(WeakReference(myEditText)))

    // do other stuff and return the view

}

4

İşte klavyeyi gizlemek ve göstermek için KeyboardHelper Sınıfı

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**
 * Created by khanhamza on 06-Mar-17.
 */

public class KeyboardHelper {
public static void hideSoftKeyboard(final Context context, final View view) {
    if (context == null) {
        return;
    }
    view.requestFocus();
    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}, 1000);
}

public static void hideSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
}, 1000);
}


public static void openSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}, 1000);
}
}

0

İlk yol :

    etPassword.post(() -> {
        etPassword.requestFocus();
        InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        manager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);
    });

İkinci yol :

Manifest'te:

    <activity
        android:name=".activities.LoginActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateVisible"/>

Kodda:

etPassword.requestFocus();

0

Ben çok yol denedim ve tho çalışmıyor, emin değilim çünkü düzenleme bölümü içeren etkinliğe parçadan paylaşılan geçiş kullanıyorum.

Btw düzenleme metinim de LinearLayout içinde.

Odak istemek için biraz gecikme ekledim ve aşağıdaki kod benim için çalıştı: (Kotlin)

 et_search.postDelayed({
     editText.requestFocus()

     showKeyboard()
 },400) //only 400 is working fine, even 300 / 350, the cursor is not showing

ShowKeyboard ()

 val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
 imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)

0
editTxt.setOnFocusChangeListener { v, hasFocus ->
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (hasFocus) {
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
            } else {
                imm.hideSoftInputFromWindow(v.windowToken, 0)
            }
        }

-1

Bu cevapların hiçbirini kendi başlarına çalıştıramadım. Benim için çözüm onları birleştirmekti:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
editText.requestFocus();
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

Bunun benim için neden gerekli olduğundan emin değilim - belgelere göre her iki yöntemin de kendi başına çalışması gerekiyor gibi görünüyor.


Bu kesinlikle iyi bir uygulama değil. Belki de Etkinlik veya Parça işlemi yazılım klavyesine müdahale ediyordu veya Giriş Yöntemi bayrakları doğru ayarlanmadı, ancak her iki durumda da bu çözüm kullanılmamalıdır.
Marcel Bro
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.