AlertDialog.Builder'ı EditText ile kullanırken, Yazılım Klavyesi açılmıyor


117

Giriş yöntemi olarak EditText ile bir giriş kutusu oluşturmak için AlertDialog.Builder kullanıyorum .

Maalesef Hafif Klavye, tekrar açıkça dokunmadığınız sürece Metni Düzenleme odakta olmasına rağmen açılmaz .

Onu patlatmaya zorlamanın bir yolu var mı?

Ben aşağıdakileri denedim ) (.show (AlertDialog.Builder) sonra; ama boşuna.

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);

Kimse yardım edebilir mi?

Teşekkürler!!


1
lütfen kaynak kodunuzu biçimlendirin.
philipp

Sonra da size oy veriyorum :) Birkaç saat boyunca aynı sorun aramasını yaptım ve grine4ka'nın son cevabı harika çalışıyor
philipp

Yanıtlar:


222

Böyle bir şey yaptım

AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();

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

dialog.show();

3
Çok teşekkür ederim. Bir süredir aradım ve gitmek istediğiniz yol bu. Tüm OnFocusChangeListeneryaklaşımlar bana çok görünüyor ve sorun yaratıyor. Sen oluşturmak zorunda AlertDialogdan AlertDialog.Builder!
philipp

Bu gerçekten bir çözüm mü? Bu sadece klavyeyi, bir giriş alanı olup olmadığına bakılmaksızın, giriş alanının odak olup olmadığına bakılmaksızın göstermeye zorlar, değil mi? =)
Ted

@ Haklısınız, bu gerçek çözüm değil, ama işe yarıyor. Diyalogda edittext yoksa ve yumuşak klavye görünmüyorsa böyle bir şey yapmaya çalıştım.
grine4ka

1
Aslında "çözmeyi" başardım (geçici çözüm). EditText için setOnFocusChangeListener'ı kullanıyorum ve odağa sahip olup olmadığını ("hasFocus" var) kontrol ederse onFocusChange'de kullanıyorum ve eğer öyleyse getWindow () yapıyorum. SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Ted

1
Not: Bunun çalışması için setSoftInputModehattı daha önce yerleştirmeniz gerekir, dialog.show()aksi takdirde çalışmaz. Basit doğru çözüm için +1 btw
Spikatrix

30

Bunu şu şekilde çözmeyi başardım:

Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

Bu benim için çalıştı.
Ahmed Daudu Sulaiman

23

Aynı kodun Tablette düzgün çalıştığını, klavyenin açıldığını, ancak Telefonda görünmediğini öğrendim, bu yüzden daha fazla araştırma yapmak "ayarla" seçeneğini işaret ediyor gibi görünüyor.

Bunu kullanıyorum, çok daha temiz geliyor.

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();

Teşekkürler. Bu kullanmaktan daha iyi olmalı SOFT_INPUT_STATE_ALWAYS_VISIBLE. Gibi SOFT_INPUT_STATE_ALWAYS_VISIBLEiletişim, UI bileşenlerini engellemek için gidiyor SOFT_INPUT_ADJUST_RESIZEmümkün boyutlandırmak ve iletişim "yukarı itmek" için.
Cheok Yan Cheng

10

Benim durumumda, İletişim kutusu gösterildiğinde klavyeyi gösterebilmemin tek yolu şuna eklemekti DialogFragment:

@Override
public void onResume() {
    super.onResume();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    myEditText.requestFocus();
}

Not SOFT_INPUT_STATE_ALWAYS_VISIBLE yerine SOFT_INPUT_STATE_VISIBLE .

Belgelerden:

int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.

Bu benim için çalışan tek çözümdü ve bunların YÜKLERİNİ denedim. Benimki, alertdialog oluşturucudan bir diyalog parçası derlemesiydi. Önemli kısım, yukarıdaki kodu onResume () içine yerleştiriyor gibiydi. Başka herhangi bir yerde işe yaramadı!
user960914

6

OnCreateDialog'da AlertDialog kullanılarak oluşturulan bir Diyaloğu göstermek için showDialog'u aradığınızda

Kodu buraya koymalısınız

    @Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
    TextView editText=(TextView) dialog.findViewById(R....);

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
       @Override
       public void onFocusChange(View v, boolean hasFocus) {
         if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
         }
       }
    });

}

5

Çok daha iyi bir çözüm verilir burada .

dialog.getWindow().clearFlags(
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

Çözüm yok. EditTextbeklendiği gibi davranır.


Bu benim için çalıştı, diğer çözüm odağı getiriyordu ancak klavye görüntülenmedi.
Akshay

2
Window window = dialog.getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

1

Bu zaten burada cevaplandı . Bir OnFocusChangeListener kullanmak benim için çalıştı.


Soru, bir AlertDialog.Builder nesnesi için yazılım giriş modunun nasıl ayarlanacağını sorar, ancak başvurduğunuz iş parçacığı, bir AlertDialog nesnesi kullanan bir örnek verir. Önerilen kodu kullanmaya çalışırsam (onFocusChangeListener içinde alert.getWindow (). SetSoftInputMode (...) kullanarak) getWindow () yönteminin AlertDialog.Builder türü için tanımlanmadığı Eclipse nesneleri. Bunu düzeltmeme yardım eder misin lütfen?
prepbgg

1

Benim durumumda, SoftInputMode, diyaloğu göstermeden önce (oluşturduktan sonra) ayarladığımda görüntülenmiyordu. Aşağıdaki kod, iletişim kutusunu gösterdikten sonra SoftInputMode'u ayarladığım yerde benim için çalıştı.

Kotlin:

val dialog = MaterialAlertDialogBuilder(context) // Other builder code
                .create()
dialog.show()
dialog.window?.apply { // After the window is created, get the SoftInputMode
    clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}

Java:

AlertDialog dialog = MaterialAlertDialogBuilder(getContext()) // Other builder code
                .create();
dialog.show();
Window window = dialog.getWindow();
if(window != null){ // After the window is created, get the SoftInputMode
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

Umarım bu benimle aynı sorunu yaşayan herkese yardımcı olur.


0

Bunu dene, benim için çalışıyor

Yazılım klavyesini görüntülemek istiyorsanız:

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(input.getWindowToken(), 0);

Ve eğer onu gizlemek istiyorsanız:

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

0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

1
Kodla birlikte biraz bağlam / açıklama eklemek daha iyidir çünkü bu, yanıtı OP ve gelecekteki okuyucular için daha kullanışlı hale getirir.
EJoshuaS - Monica'yı yeniden etkinleştir

0

Bu sorun, AlertDialog.onCreate çağrıldıktan sonra EditText eklendiğinde oluşur.

https://developer.android.com/reference/androidx/appcompat/app/AlertDialog.Builder

AlertDialog sınıfı, iletişim kutusundaki görünümlerden herhangi birinin View.onCheckIsTextEditor () öğesinden doğru dönüp dönmediğine bağlı olarak android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM'i sizin için otomatik olarak ayarlamayla ilgilenir.

FLAG_ALT_FOCUSABLE_IM bayrağını temizlemeniz gerekir.

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

AlertDialog.show, DialogFragment.onStart içinde çağrıldığından, kodu DialogFragment.onStart içine ekleyebilirsiniz.

@Override
public void onStart() {
    super.onStart();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

Veya bir DialogFragment kullanmıyorsanız Dialog.setOnShowListener'ı kullanabilirsiniz.

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
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.