Düzenleme metni odaklandığında yazılım klavyesi nasıl gösterilir?


461

EditTextOdaklanıldığında (cihazın fiziksel bir klavyesi yoksa) otomatik klavyeyi otomatik olarak göstermek istiyorum ve iki sorunum var:

  1. Ekranım Activitygörüntülendiğinde, EditTextodaklandığım ancak klavye görüntülenmediğinde, klavyeyi göstermek için üzerine tekrar tıklamam gerekir (ekranım görüntülendiğinde Activitygörüntülenmelidir).

  2. Ve klavyede bitirdiğimde, klavye işten çıkarıldı, ancak EditTextodaklanmaya devam ediyor ve istemiyor (çünkü düzenlemem yapıldı).

Devam etmek için sorunum, iPhone'da daha çok benzer bir şey olması: klavyenin durumumla senkronize kalmasını sağlıyor EditText(odaklanmış / odaklanmamış) ve elbette fiziksel bir klavye varsa yumuşak bir klavye sunmuyor.


Ben sadece gibi bir temel EditText var: <EditText android: id = "@ + id / myEditText" android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: imeOptions = "actionDone" /> Ve benim aktivitemde var this: EditText editTxt = (EditText) findViewById (R.id.myEditText); editTxt.requestFocus ();
Ludovic Landry

2
Bu bana bu yazıdaki cevaplardan daha iyi yardımcı oldu: stackoverflow.com/a/2418314/1491212
Armel Larcier

Yanıtlar:


629

Yazılım klavyesini görünmeye zorlamak için

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

Ve odağı kaldırmak için EditText, ne yazık ki odaklanmak için bir kuklaya ihtiyacınız var View.

Umarım bu yardımcı olur


Kapatmak için kullanabilirsiniz

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);

Bu bir iletişim kutusunda kullanmak için çalışır

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}

2
Bunu yaparsam, etkinlik göründüğünde (iyi) yazılım klavyesi gösterilir, ancak odağım EditText'ten ayrılıp örneğin bir Düğmeye gittiğinde klavye kalır (bu kötüdür).
Ludovic Landry

157
Zaten odaklanmış bir iletişim kutusundaki EditText ile benim için çalışmıyor. Emin değilim neden.
Matthias

10
@AbdellahBenhammou, belki bir istekte bulunurken, yumuşak girdiyi göstermeden önce düzenleme metninize odaklanma çağrısı sorununuzu çözebilir. Benim için oldu.
r1k0

18
@AbdellahBenhammou, bunu DialogFragment'ınızın onCreate (): getDialog (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Phillip

22
Sadece yourEditText.requestFocus()burada açıklandığı gibi birlikte çalıştı : stackoverflow.com/questions/8991522/…
Vivek Pandey

231

Ben de aynı problemi yaşadım. Metin VISIBILITY GONE'dan VISIBLE'a değiştikten hemen sonra odağı ayarlayıp yumuşak klavyeyi göstermem gerekiyordu. Aşağıdaki kodu kullanarak bunu başardı:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

Benim için 100 ms gecikme ile çalışır, ancak herhangi bir gecikme olmadan veya sadece 1 ms gecikme ile başarısız oldu.

Kodun yorumlanan kısmı, yalnızca bazı cihazlarda çalışan başka bir yaklaşımı gösterir. İşletim sistemi sürüm 2.2 (emülatör), 2.2.1 (gerçek cihaz) ve 1.6 (emülatör) üzerinde test yaptım.

Bu yaklaşım bana çok acı verdi.


48
Bir şeyin aynı zamanda çok çirkin ve çok güzel olabileceğini bilmiyordum. Çok teşekkür ederim!
mkerley

15
@ jellyfish bu bir musluk taklit eder EditText. Bunu okuyan diğerleri için, yeni bir pencere oluşturmak yerine widget'ın kendisindeki yöntemi Handlerde kullanabilirsiniz . View.postDelayed()yourEditText
Tony Chan

5
Bu bir hack - David Chandler'ın çok daha iyi bir çözümü.
Ben Bederson

4
David Chandler'in çözümü tüm Android sürümlerinde / cihazlarda çalışıyorsa ve GÖRÜNÜRLÜK'ün GONE'dan VISIBLE'a değiştiği durumda, EVET - onun çözümünü kullanmalısınız.
Mike Keskinov

3
Kabul. Tüm Android lezzetlerinde çalışan daha iyi bir çözüm biliyor musunuz?
Mike Keskinov

162

Klavyenin görünmesini sağlamak için

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

Bu yöntem, doğrudan InputMethodManager'ı çağırmaktan daha güvenilirdir.

Kapatmak için şunu kullanın:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

12
Birisi bunun neden doğrudan çağırmaktan daha güvenilir olduğunu açıklayabilir InputMethodManagermi? (Birincisi, raukodraug'un çözümünün aksine işe yaramaz.)
Matthew Quiros

5
Benim için de çalışmıyor. Android'de çalışma 2.3.5. raukodraug'un çözümü benim için çalışıyor. Sürüm bağımlılığı arandı ancak bulunamadı.
Hugo Logmans

2
Bu benim için Android 4.4.2'de çalıştı. Bu gönderi için çözüm olarak seçilen InputMethodManager yöntemi benim için çalışmadı.
Phil

cevap yöntemini kullandıktan sonra ben bu ekledi ve çalıştı, ama onsuz işe yaramadı. thanx
Manny265 13:14

2
Android 4.4.2'de benim için çalışmadı. Klavyeyi gösterir ancak gizlemedi.
John J Smith

87

Başka hiçbir şey çalışmadığında, gösterilmeye zorlayın :

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

Ve daha sonra, örneğin kapatmak isterseniz, örneğin onPause () içinde şunları çağırabilirsiniz:

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

4
Haklıydın, @Bolling! Başka hiçbir şey çalışmadığında, kodun beni kurtardı. Teşekkürler!
Willian Paixao

3
Kodunuz benim için çalışan tek koddu ve bu sayfadaki her çözümü denedim! Çok teşekkürler!
Mattia Ruggiero

4
zorlamayın. bazı durumlarda ön plandan arka plana gittiğinizde, klavye zorladığınız için orada kalacaktır. onun bir parçalanma sorunu ama samsung duos gördüm.
j2emanue

Genellikle her zaman klavyeyi onPause () kapatmak için kod var çünkü onu zorlamadıysanız bile takıldığını gördüm.
Bolling

Bu işe yaradı, ancak diğer ekranlara geçildiğinde hala açık kalıyor
Sithu

75

Aşağıdaki kod, Google'ın SearchView için 4.1 kaynak kodundan alınmıştır. Android'in daha az sürümlerinde de işe yarıyor gibi görünüyor.

private Runnable mShowImeRunnable = new Runnable() {
    public void run() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.showSoftInput(editText, 0);
        }
    }
};

private void setImeVisibility(final boolean visible) {
    if (visible) {
        post(mShowImeRunnable);
    } else {
        removeCallbacks(mShowImeRunnable);
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindowToken(), 0);
        }
    }
}

Ardından, Denetim / Etkinlik oluşturulurken aşağıdaki kodun eklenmesi gerekir. (Benim durumumda bir faaliyetten ziyade bileşik bir kontrol).

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});

Teşekkürler! Şaşırtıcı derecede iyi çalışıyor. Ve bu konuda okuduğum tüm cevaplardan ve konulardan daha rahat olduğum çözüm.
Rui

37
:-D setImeVisibility(hasFocus)?
Matthias

Aslında "kendi arama görünümümü haddeleme" (çünkü bunu yapmak istemiyordu ama nedenleri vardı) bu yöntemi denedim. Faaliyetin başlatılması haricinde bu benim için çalıştı. Ben aktiviteye android: windowSoftInputMode = "alwaysVisible" ekledim ve zaten düzenleme metninde requestFocus () çağrıldı. Bir şampiyon gibi çalışır.
javahead76

RemoveCallbacks (mShowImeRunnable) ihtiyacı hakkında herhangi bir fikriniz var mı? Runnable kuyruktan çalıştırmak için seçildiğinde, aynı zamanda kuyruktan da kaldırılacağını düşündüm?
Cheok Yan Cheng

1
Birkaç varyasyon denedikten sonra, bu benim için tutarlı bir şekilde çalışan tek şeydi (Android 4.42). Teşekkürler
John J Smith

34

android:windowSoftInputMode="stateAlwaysVisible" -> manifest Dosyasında.

edittext.requestFocus(); -> kod içinde.

Bu, etkinlik göründüğünde düzenleme metninin istek odağına sahip olduğu yumuşak klavyeyi açacaktır.


2
Bu, Etkinlik oluşturma sırasında klavyeyi açar.
xpto

soruyu cevaplamıyor, ama bana yardımcı oldu :)
S.Thiongane

anahtarı api 22'de açmaya başlar
David

Davam için iyi çalışıyor. Neden sadece xml istek odak özniteliği de bir söz gerekiyor merak ediyorum manifest!
sud007

30

Aşağıdaki kod ile bazı basit durumlarda bazı şans oldu. Tüm testleri bitirmedim ama ....

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Ve klavyede presto ortaya çıkıyor.


Benim durumum için isteğe bağlı bazı bilgiler eklemek için bir düğme vardı. Button.onClick işleyicisine, isteğe bağlı bilgilerin girişi için yazılım klavyesini görünmeye zorlamak üzere yukarıdaki kod eklenmiştir. Droid 2.2.2
Dent

bu iyi bir çözümdür, ancak daha sonra arayan tarafından yeniden kullanılmak üzere MotionEvent nesnesi oluşturmalı ve kullanımdan sonra üzerlerine geri dönüşüm () çağırmalısınız.
jimbob

ACTION_UP ile argümanı olarak sadece bir dispatchTouchEvent () gerekir.
Mohammed Junaid

15

Yumuşak klavyeyi görünmeye zorlayabilirsiniz, benim için çalışıyor:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

1
Bu benim için çalışıyor ... Ben bu InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.showSoftInput (ad, inputMethodManager.SHOW_IMPLICIT); veya getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); ama hiçbiri çalışmıyor.
Günay Gültekin

10

Bazen raukodraug'un cevabı işe yaramaz. Bazı denemeler ve hatalarla bu şekilde yaptım:

public static void showKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
}

Ve EditText bölümü:

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(getActivity());
            } else {
                showKeyboard(getActivity());
            }
        }
    });

1
Bu, Android 5'de benim için çalışan tek çözüm
user1021430

10

Klavyeyi gizlemek için şunu kullanın:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

ve klavyeyi göstermek için:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Bir DialogFragment için, bunu geçersiz kılınmış olarak çağırabilir onStart()ve getDialog().getWindow()alternatif olarak kullanabilirsiniz getActivity().getWindow().
Mr-IDE

10

Ve Kotlin için sadece şu uzantıları kullanın:

fun EditText.showKeyboard() {
    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)
}

Tam da aradığım şey.
lasec0203

8

Parça için, çalıştığından emin olun:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

7

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

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

android:windowSoftInputMode="stateVisible" 

6

Etkinlik animasyonlarının Yazılım Klavyesini devre dışı bırakabileceğini keşfettiğimde, Yumuşak Klavye ile ilgili sorunumun çözülüp çözülmediği çözüldü. İle niyet aradığınızda

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

ve

overridePendingTransition(0, 0);

Yumuşak Klavyeyi gizleyebilir ve göstermenin bir yolu yoktur.


6

Çeşitli farklı durumlarda aynı sorunu yaşadım ve bulduğum çözümler bazılarında işe yaradı, ancak başkalarında çalışmaz, bu yüzden bulduğum çoğu durumda çalışan bir birleştirme çözümü:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}

6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});

6

Burada her şeyi birleştirdim ve benim için çalışıyor:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

6

Benim için çalıştı. Klavyeyi göstermek için de bunu deneyebilirsiniz:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

5

kod pasajı. . .

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
    View rootView = ((Activity) activityContext)
            .findViewById(android.R.id.content).getRootView();

    imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}

public void showKeyboard(Context activityContext, final EditText editText){

    final InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (!editText.hasFocus()) {
        editText.requestFocus();
    }

    editText.post(new Runnable() {
        @Override
        public void run() {
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        }
    });
}

5

Kotlin odaklanmak için klavye uzantısı.

Bu, çok uzun veya eksik olan önceki yanıtların bir kombinasyonudur.

Bu uzantı, odaklanma isteğinden sonra ekran klavyesini gösteren ileti kuyruğunda çalıştırılabilir bir mesaj yayınlar:

fun View.showSoftKeyboard() {
    post {
        if (this.requestFocus()) {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
        }
    }
}

Daha sonra gerektiğinde herhangi bir görünümden arayın:

editText.showSoftKeyboard()

4

sadece manifest dosyasında android: windowSoftInputMode = "stateHidden" ekleyin ...


4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

4

Manifestinizin içinde:

android:windowSoftInputMode="stateAlwaysVisible" - başlangıçta başlatılan klavye. android:windowSoftInputMode="stateAlwaysHidden" - başlangıçta gizli klavye.

Kullanmayı da seviyorum "adjustPan"çünkü klavye açıldığında ekran otomatik olarak ayarlanıyor.

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>

4

Bu satırı EditText görünümünüze eklemeniz yeterlidir:

android:isScrollContainer="true"

ve TADA - klavye otomatik olarak görünmeye başladı!

Benzer bir sorun yaşadım ve bu basit ve garip çözümü keşfettim.

Burada zaten user3392439 tarafından belirtildiği gibi, odakta klavyenin görünümü bir şekilde XML dosyasında kaydırma bileşeninin baskısı ile garip bir şekilde bağlı.

Aynı XML'de yukarıda belirtilen satırı içeren başka bir EditText görünümünün varlığı bile , EditTexts'ten hangisinin odaklanmış olursa olsun klavyenin görünmesini sağlar.

XML dosyanızda kaydırma bileşeninden oluşan en az bir görünür görünümünüz varsa, klavye otomatik olarak odakta görünür.

Kaydırma yoksa - klavyenin görünmesi için EditText'i tıklamanız gerekir.


Bu çok garip ama kesinlikle işe yarıyor - Ben requesFocus()bir tıklama işleyicisi içinden deniyordu ve bu açık bir showSoftInput SHOW_FORCED dışında tek yolu
çekti

Holy sh * t, teşekkürler dostum. Neden çalıştığına dair hiçbir fikrim yok ama farklı üreticilerin 8 cihazında test ettim ve her zaman çalıştı!
Antonio Vlasic

3

Yukarıda verilen tüm çözümler ( InputMethodManager etkileşimi OnFocusChangeListener.onFocusChange dinleyici sizin bağlı EditText , etkinlikte tek bir düzenlemeniz varsa işe .

Benim durumumda iki düzenlemem var.

 private EditText tvX, tvY;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 tvX.setOnFocusChangeListener(this);
    tvY.setOnFocusChangeListener(this);

@Override
public void onFocusChange(View v, boolean hasFocus) {       
    InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(tvX.hasFocus() || tvY.hasFocus()) {            
        imm.showSoftInput(v, 0);            
    } else {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);         
    }       
};

Ben onFocusChange tvX hasFocus = true (klavye gösterilmiştir) ile ama sonra tvY hasFocus = true (klavye gizli) ile tetiklendi gözlemledim. Sonunda klavye görünmüyordu.

"EditText metninin odağı varsa klavyeyi göster" durumunda genel çözüm doğru ifadeye sahip olmalıdır


3

Aktivitenin onResume () bölümünde, bringKeyboard () yöntemini çağırabilirsiniz.

 onResume() {
     EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
     bringKeyboard(yourEditText);
 }


  protected boolean bringKeyboard(EditText view) {
    if (view == null) {
        return false;
    }
    try {
      // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
        String value = view.getText().toString();
        if (value == null) {
            InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            return true;
        }
    } catch (Exception e) {
        Log.e(TAG, "decideFocus. Exception", e);
    }
    return false;
  }

Nedir WidgetUtils.showKeyboard? Buradaki en önemli nokta bu.
TWiStErRob

2

Yanıtların hiçbiri benim için çalışmadı. İşte basit bir yol.

searchEditText.setVisibility(View.VISIBLE);
                final Handler handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        searchEditText.requestFocus();
                    }
                }, 400);

400ms için requestFocus () yöntemini erteledim.


Çok teşekkürler, klavye gösteren için biraz gecikmeye ihtiyacı var ...
hkh114

1

Uygulamalarımdan birinde, yumuşak klavye etkinliğe girerken otomatik olarak gösterildiğinden garip bir davranış keşfettim (onCreate'de bir editText.requestFocus () var).

Daha fazla kazarken, bunun mizanpajın etrafında bir ScrollView olduğu için olduğunu keşfettim. ScrollView kaldırırsanız, davranış özgün sorun deyiminde açıklandığı gibidir: yalnızca önceden odaklanmış editText tıklandığında yazılım klavyesi görünür.

Sizin için işe yaramazsa, bir ScrollView koymayı deneyin - yine de zararsızdır.


1

Görünüm animasyonlarını kullanırken de benzer bir sorun yaşadım . Animasyonun bitmesini bekleyeceğimden emin olmak için bir animasyon dinleyicisi koydum , gösterilen düzenleme metninde bir klavye erişimi istemeye çalışmadan önce koydum.

    bottomUp.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            if (textToFocus != null) {
                // Position cursor at the end of the text
                textToFocus.setSelection(textToFocus.getText().length());
                // Show keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT);
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });

1

Ben bu yüzden bir swithview kullanarak / gibi net odak talep gerekir raukodraug ile katılıyorum:

    final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    final View btn = viewSwitcher.findViewById(R.id.address_btn);
    final View title = viewSwitcher.findViewById(R.id.address_value);

    title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewSwitcher.showPrevious();
            btn.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // EditText affiche le titre evenement click
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btn.clearFocus();
            viewSwitcher.showNext();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
            // Enregistre l'adresse.
            addAddress(view);
        }
    });

Saygılarımızla.

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.