2012-03-21 17 views
7

Używam AlertDialog.Builder w systemie Android, aby szybko poprosić użytkownika o tekst. Okno pokazuje się i działa świetnie, ale użytkownik musi kliknąć pole EditText, aby wczytać miękką klawiaturę. Czy istnieje sposób, aby otworzyć klawiaturę i skupić się na każdym otwarciu mojego okna dialogowego? Tu jest mój kodu:Domyślna fokus i klawiatura do EditText w Android AlertDialog

final Map<String,Object> rowData = itemList.get(mPosition); 
        final EditText input = new EditText(searchList.getContext()); 
       input.requestFocus(); 


       input.setSingleLine(); 
       final AlertDialog dialog = new AlertDialog.Builder(searchList.getContext()) 
       .setTitle(StringUtils.getSafeString(rowData.get("label"))) 
       .setView(input) 
       .setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         rowData.put("value", StringUtils.getSafeString(input.getText())); 
         searchList.invalidateViews(); 

        } 
       }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         // Do nothing. 
        } 
       }).create(); 
       dialog.show(); 

Odpowiedz

12

użyć następującego kodu. To zadziałało dla mnie.

editText.setOnFocusChangeListener(new OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      editText.post(new Runnable() { 
       @Override 
       public void run() { 
        InputMethodManager inputMethodManager= (InputMethodManager) YourActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); 
       } 
      }); 
     } 
    }); 
    editText.requestFocus(); 
+0

Dziękuję bardzo, to działa idealnie !! –

-2

w układzie XML

wezwanie

<requestFocus/> 

wewnątrz domyślnie EditText

<EditText 
android:blabla 
.... 
<requestFocus/> 
/> 
+1

AlertDialog.Builder nie używa układ XML, to tylko w EditText, który został utworzony w kodzie.Próbowałem już nazywać prośbę o skupienie się na wygenerowanym EditText w wielu miejscach i nie działa tak, jakbym chciał. To nie działa rozwiązanie tego pytania. – cain

0

InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); Do ukrywania użycia klawiatury:

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

lub spróbuj poniżej kod, ale trzeba ustawić requestFocus() lub do EditText

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

ukryty klawiaturę kiedy programowo ustawienie ostrości na zasadzie EditText w Dialog Android.

Miałem również ten problem i było to dość proste rozwiązanie - oto moje sugerowane rozwiązanie. Chociaż działał na mnie w DialogFragmentach, nie widzę powodu, dla którego nie działałby on w twoim przypadku.

Zasadniczo klawiatura nie jest wyzwalana, ponieważ widok jest tworzony programowo. Rzeczywista poprawka została po prostu oddanie tej linii w metodzie onCreateDialog:

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

Z dokumentacji Androida na DialogFragments:

Jeżeli użytkownik koncentruje się na EditText, miękka klawiatura pojawia się automatycznie. Aby zmusić to do tego przy naszym programowym ustawieniu ostrości, należy wywołać getDialog(). GetWindow(). SetSoftInputMode(). Zauważ, że wiele operacji, które mogłeś wykonać wcześniej w Dialogu, może nadal być wykonanych w DialogFragment, ale musisz wywołać getDialog(). GetWindow() zamiast tylko getWindow().

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    //setup your dialog builder and inflate the view you want here 
    ... 
    //Make sure your EditText has the focus when the dialog is displayed 
    edit.requestFocus(); 
    //Create the dialog and save to a variable, so we can set the keyboard state 
    Dialog dialog = builder.create(); 
    //now, set to show the keyboard automatically 
    dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); 
    return dialog; 
} 
+1

Dobra droga! To powinna być zaakceptowana odpowiedź. Użyłem 'getWindow() .setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);' w moim konstruktorze podklasy AppCompatDialog. –

+0

dialog.getWindow() może zwrócić wartość null –

0

użyciu widoku niestandardowego jeśli trzeba go częściej

public class RequestFocusEditText extends AppCompatEditText { 
    private RequestFocusEditText self; 

    public RequestFocusEditText(final Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.self = this; 

     setOnFocusChangeListener(new OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       post(new Runnable() { 
        @Override 
        public void run() { 
        InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputMethodManager.showSoftInput(self, InputMethodManager.SHOW_IMPLICIT); 
       } 
      }); 
     } 
    }); 
    requestFocus(); 
    } 
} 
Powiązane problemy