Anzeigen von Soft-Tastatur, wenn AlertDialog.Builder-Objekt geöffnet wird

Mein Code zum Öffnen eines Eingabedialogs lautet wie folgt:

final AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Dialog Title"); alert.setMessage("Request information"); LayoutInflater factory = LayoutInflater.from(this); final View textEntryView = factory.inflate(R.layout.edittextautotextlayout, null); final EditText inputBox = (EditText) textEntryView.findViewById(R.id.my_et_layout); alert.setView(inputBox); 

Das funktioniert gut, außer dass ich die Texteintragszeile tippen muss, bevor die Softtastatur erscheint.

  • Android EditText in AlertDialog scheint zu breit
  • So stellen Sie Single Choice Items in AlertDialog ein?
  • Android: AlertDialog mit benutzerdefinierter Ansicht und abgerundeten Ecken
  • Android AlertDialog nicht nach dem Klicken auf PositiveButton entlassen
  • Gibt es eine Möglichkeit, dass AlertDialog mit ungültigen Eingaben geschlossen wird?
  • Können wir vertikale Tasten in einem Android Alert-Dialog haben?
  • Nach dem hier gegebenen Rat habe ich versucht, einzufügen:

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

    Aber Eclipse-Objekte, die "die Methode getWindow () ist nicht für den Typ AlertDialog.Builder definiert".

    Es scheint, dass der setOnFocusChangeListener-Code für ein AlertDialog-Objekt funktioniert, aber kein AlertDialog.Builder. Wie soll ich meinen Code ändern, damit die Softtastatur automatisch erscheint.

  • Alle Elemente einer ArrayList ändern sich, wenn ein neuer hinzugefügt wird?
  • Ist es möglich, einen Stil aus benutzerdefiniertem Attribut zu erben oder zu erweitern
  • Deaktivieren Sie das Scrollen im Kind Recyclerview android
  • Senden per E-Mail mit Anhang über GMailSender?
  • Wie zeichne man kostenloses Polygon in Google Map V2 in Android?
  • So vermeiden Sie das Laden von Cache-App-Daten aus Google Drive
  • 12 Solutions collect form web for “Anzeigen von Soft-Tastatur, wenn AlertDialog.Builder-Objekt geöffnet wird”

    Solange du immer die Tastatur sofort zeigen musst, sobald der Dialog stattfindet, anstatt einmal ein bestimmtes Formular-Widget innerhalb wird Fokus (zum Beispiel, wenn dein Dialog nur ein EditText und eine Schaltfläche zeigt) können Sie Folgendes tun:

     AlertDialog alertToShow = alert.create(); alertToShow.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); alertToShow.show(); 

    Anstatt sofort .show() auf deinem Erbauer sofort, kannst du stattdessen anrufen .create() , die dir erlaubt, eine zusätzliche Verarbeitung zu machen, bevor du sie auf den Bildschirm zeigt.

    Dies ist als Antwort auf miannelle.

    Die folgende Methode wird aufgerufen, wenn eine Menüoption ausgewählt ist:

     private void addNote() { final Dialog dialog = new Dialog(this); dialog.setContentView(R.layout.textentryalertdialog); dialog.setTitle("Add note"); TextView msgText = (TextView) dialog.findViewById(R.id.messagetext); msgText.setText("Whatever prompt you want"); final EditText inputLine = (EditText) dialog.findViewById(R.id.my_edittext); Button okButton = (Button) dialog.findViewById(R.id.OKButton); okButton.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { dialog.dismiss(); // app specific code } }); Button cancelButton = (Button) dialog.findViewById(R.id.CancelButton); cancelButton.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { dialog.dismiss(); } }); dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); dialog.show(); } 

    Die Datei textentryalertdialog.xml definiert ein lineares Layout mit

    TextView android: id = "@ + id / messagetext" …

    EditText android: id = "@ + id / my_edittext" …

    Button android: id = "@ + id / OKButton" …

    Button android: id = "@ + id / Abbrechen" …

    Ich hoffe das hilft.

    Mit der Ermutigung von Mur Votema (siehe seine Antwort oben) habe ich meine Frage beantwortet, indem ich einen benutzerdefinierten Dialog basierend auf der Dialog-Klasse baue. Im Gegensatz zu einer Warnung, die auf AlertDialog.Builder basiert, akzeptiert ein solcher benutzerdefinierter Dialog den Befehl getWindow (). SetSoftInputMode (…) und ermöglicht somit die automatische Anzeige der Softtastatur.

    Für die Anleitung zum Aufbau eines benutzerdefinierten Dialogs fand ich diese Webseite und das besonders hilfreich.

    Wenn Sie das Dialogfeld zusammen mit einem weichen Tastenfeld aufrufen möchten, so dass der Benutzer von Tippen auf Bearbeiten von Text im Dialogfeld, um die Tastatur anzuzeigen, z. B. wenn Sie einen gewissen Wert aus dem Dialogfeld nehmen möchten, dann verwenden Sie diesen einfachen Code, Es wird dein Problem lösen.

      public void onClick(final View v) { AlertDialog.Builder alert = new AlertDialog.Builder(v.getContext()); alert.setIcon(R.drawable.smsicon); alert.setTitle(" Secrete Code"); alert.setMessage("Enter a Key for secrete text !"); final EditText shft_val = new EditText(v.getContext()); shft_val.setInputType(InputType.TYPE_CLASS_NUMBER);//changing the keyBoard to No only,restrict the string etc alert.setView(shft_val); //pOp Up the key pad on Edit Text focus event shft_val.setOnFocusChangeListener(new OnFocusChangeListener() { public void onFocusChange(View arg0, boolean arg1) { InputMethodManager inputMgr = (InputMethodManager)v.getContext(). getSystemService(Context.INPUT_METHOD_SERVICE); inputMgr.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY); } }); alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { //Your specific code... } }); alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); return; } }); alert.show(); } 

    Versuchen Sie mit inputBox

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

    Versuchen Sie es mit der Ansicht

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

    Haben Sie versucht, sich auf Ihren EditText -> inputBox.requestFocus () oder so etwas zu konzentrieren?

    Ich weiß, diese Frage ist wirklich alt, aber da ich etwa 20 verschiedene so genannte "Lösungen" ausprobiert habe, werde ich posten, was eigentlich nur für mich gearbeitet hat.

    Diese Antwort basiert auf der Antwort von Pir Fahim Shah, der mich in die richtige Richtung zeigte (Danke):

    Vergewissern Sie sich, dass Sie diese in das OnCreate Ihrer Aktivität setzen, damit die gezwungenen Tastaturen ausgeblendet werden, wenn der Dialog geschlossen ist:

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

    Dann erstellen Sie einen Dialog wie folgt:

      AlertDialog.Builder builder = new Builder(this); builder.setTitle("title"); final EditText input = new EditText(this); input.setText("text"); input.setSelection(input.getText().length()); // set cursor to end builder.setView(input); input.setOnFocusChangeListener(new OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if(hasFocus) { InputMethodManager inputMgr = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputMgr.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY); } } }); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // do something here dialog.dismiss(); } }); builder.setNegativeButton("Cancel", null); builder.show(); 

    Hallo Prepbgg gibt es eigentlich einen alternativen Weg zu dem, was du gemacht hast. Ich musste meine Mine in meinem ArrayAdapter benutzen. Was ich tat, war, den Kontext der Aktivität in den Arrayadapter zu übergeben und dann auf den Zugriff auf getWindow () so etwas zu rufen:

     NoteArrayAdapter(Activity _activity, int _layout, ArrayList<Note> _notes, Context _context) { callingNoteListObj = (NoteList) _context; } // withiin getView callingNoteListObj.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); // within parent activity's onCreate() thisObject = this; //within my parent activity's fillData() (NoteList) adapter = new NoteArrayAdapter(activity, R.layout.channel_note_list_item, noteList, thisObject); 

    Im folgenden Code-Snippet zeige ich, wie man ein beliebiges LinearLayout in einem DialogFragment . Einer mit AlertDialog (wo die AlertDialog nicht funktioniert) und ein anderer Weg ohne AlertDialog (wo die AlertDialog funktioniert)

     public static LinearLayout createLinearLayout(Context context) { LinearLayout linearLayout = new LinearLayout(context); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); String html; html = "<form action=search method=get >\n"; html += "Google Search: <input name=q value=\"Johnny Depp\" /><br/>\n"; html += "<input type=submit name=output value=search /><br/>\n"; html += "</form>\n"; WebView webView = new WebView(context); webView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); webView.getSettings().setJavaScriptEnabled(true); webView.setWebChromeClient(new WebChromeClient()); webView.setWebViewClient(new WebViewClient()); webView.loadDataWithBaseURL("http://www.google.com", html, "text/html", "UTF-8", null); linearLayout.addView(webView); return linearLayout; } public void showWithAlertDialog() { DialogFragment dialogFragment = new DialogFragment() { public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder .setTitle("With AlertDialog") .setView(createLinearLayout(getActivity())); return builder.create(); } }; FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); dialogFragment.show(fragmentTransaction, "dialog"); } public void showWithoutAlertDialog() { DialogFragment dialogFragment = new DialogFragment() { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getDialog().setTitle("Without AlertDialog"); getDialog().setCanceledOnTouchOutside(false); return createLinearLayout(getActivity()); } }; FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); dialogFragment.show(fragmentTransaction, "dialog"); } 

    Ich glaube du hast es fast in deiner ursprünglichen Frage gearbeitet. Versuchen Sie, einen final AlertDialog zu final AlertDialog , um getWindow() auf z

     // Create the dialog used to modify the mailbox alias final AlertDialog dialog = alert.create(); inputBox.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { dialog.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } } }); 

    Ich habe diesen Code getestet und die Tastatur erscheint nun automatisch auf den meisten meiner Geräte, einschließlich:

    • Samsung Galaxy Tab OS 2.2
    • Samsung Galaxy S OS 2.1
    • HTC Sensation OS 2.3.4

    Einige weitere Kommentare zu dieser Lösung:

    1) Überprüfen Sie, ob Sie irgendetwas in Ihrem XML haben, um bereits den Fokus anzufordern, da dies diesen Code beenden kann (nach Ted in der Frage, mit der Sie verknüpfen).

    2) Dieser Code scheint nicht auf meinem HTC G2 laufen OS 2.3.4 zu arbeiten. Ich denke, das ist, weil es eine physische Tastatur hat, und vielleicht die WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE Option funktioniert nicht mit ihm?

    Ich habe auch versucht, SOFT_INPUT_STATE_VISIBLE (ohne die IMMER), aber das hielt die Tastatur automatisch erscheinen.

    3) Sie können auch Code hinzufügen, damit der Benutzer die Taste Fertig auf der Tastatur drücken kann, um die Änderungen einzureichen, zB

     inputAlias.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER && inputAlias.isFocused() && inputAlias.getText().length() != 0) { // Save the new information here // Dismiss the dialog dialog.dismiss(); return true; } return false; } }); 

    Ich fand das in einem Alert-Dialog, der an verschiedenen Orten angerufen wurde

      case R.id.birthyear: case R.id.ymax: input.setInputType(InputType.TYPE_CLASS_NUMBER); break; 

    Denken Sie daran, ich habe auch viele andere Dinge probiert. Scheint zart

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.