Question

Mon code pour ouvrir une boîte de dialogue d'entrée comme suit lit comme suit:

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);

Cela fonctionne bien, sauf que je dois taper la ligne de saisie de texte avant l'affiche du clavier tactile.

Après les conseils donnés ici Je l'ai essayé insérer:

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);
        }
    }
});

mais les objets Eclipse que "la méthode getWindow () n'a pas été défini pour le type AlertDialog.Builder".

Il semble que le code setOnFocusChangeListener fonctionne pour un objet AlertDialog mais pas AlertDialog.Builder. Comment dois-je modifier mon code pour faire apparaître le clavier souple automatcially.

Était-ce utile?

La solution 3

Avec l'encouragement de Mur Votema (voir sa réponse ci-dessus) J'ai répondu à ma question en construisant une boîte de dialogue personnalisée basée sur la classe de dialogue. Contrairement à une alerte basée sur AlertDialog.Builder une telle boîte de dialogue personnalisée accepte les la commande getWindow () de setSoftInputMode (...). Et permet donc d'afficher automatiquement le clavier virtuel.

Pour obtenir des conseils sur la construction d'un dialogue personnalisé J'ai trouvé ce page Web et cette particulièrement utile.

Autres conseils

Tant que vous avez toujours besoin de montrer le clavier immédiatement une fois la boîte de dialogue ouvre plutôt qu'une fois une forme spécifique un widget pénètre à l'intérieur mise au point (par exemple, si votre dialogue montre juste un EditText et un bouton), vous pouvez effectuer les opérations suivantes:

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

Plutôt que d'appeler .show() sur votre constructeur immédiatement, vous pouvez appeler au lieu .create() qui vous permet de faire des traitements supplémentaires à ce sujet avant de l'afficher sur l'écran.

Ceci est en réponse à miannelle.

La méthode suivante est appelée lorsque l'option de menu est sélectionné:

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();
}

Le fichier textentryalertdialog.xml définit une disposition linéaire contenant

TextView android: id = "@ + id / texte_du_message" ...

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

Bouton android: id = "@ + id / OKButton" ...

Bouton android: id = "@ + id / CancelButton" ...

J'espère que cette aide.

Si vous voulez faire apparaître la boîte de dialogue avec clavier souple, de sorte que l'utilisateur peut libérer du robinet sur le texte d'édition à l'intérieur de dialogue pour afficher le clavier, par exemple si vous allez prendre une valeur de boîte de dialogue, utilisez cette code simple, il permettra de résoudre votre problème.

        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();
                    }

essayez d'utiliser inputBox

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

essayez d'utiliser vue

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

Avez-vous essayé de nous concentrer ensemble sur votre EditText -> inputBox.requestFocus () ou quelque chose comme ça

Je sais, cette question est vraiment vieux, mais comme je l'ai essayé 20 différents que l'on appelle des « solutions », je vais poster, ce qui en fait ne fonctionnait pour moi finalement.

Cette réponse est basée sur la réponse de Pir Shah Fahim, qui m'a orienté dans la bonne direction (Merci):

Assurez-vous que, vous mettez cela dans le onCreate de votre activité, de sorte que les claviers forcés sont cachés, quand dialogue est fermé:

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

puis créer une boîte de dialogue comme ceci:

    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();

Je pense que vous aviez presque fonctionner dans votre question initiale. Essayez de créer un final AlertDialog appeler getWindow() sur, par exemple

// 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);
        }
    }
});

Je l'ai testé ce code et le clavier apparaît maintenant automatiquement la plupart de mes appareils, y compris:

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

D'autres commentaires sur cette solution:

1) Vérifiez si vous avez quelque chose dans votre XML déjà pour demander la mise au point, car cela pourrait mettre fin à ce code de travail (selon Ted à la question que vous lien vers).

2) Ce code ne semble pas fonctionner sur mon HTC G2 sous OS 2.3.4. Je suppose que cela est parce qu'il a un clavier physique, et peut-être l'option WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE ne fonctionne pas avec elle?

J'ai aussi essayé SOFT_INPUT_STATE_VISIBLE (sans toujours), mais qui a arrêté le clavier apparaissant automatiquement.

3) Vous pouvez également ajouter du code afin que l'utilisateur peut appuyer sur le bouton Terminé du clavier pour soumettre les modifications, par exemple.

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;
  }
});

Je crée un AlertDialog et utiliser une vue personnalisée qui contient un EditText. Et je veux que le clavier virtuel à afficher lorsque la boîte de dialogue apparaît et à cacher si l'utilisateur clique sur le bouton OK ou quelque part en dehors de la boîte de dialogue.

Ce morceau de code est de androidx.perference.PreferenceDialogFragmentCompat et je nettoyer un peu.

final AlertDialog.Builder builder = new AlertDialog.Builder(context)
        .setTitle(mDialogTitle)
        .setPositiveButton(mPositiveButtonText, null)
        .setNegativeButton(mNegativeButtonText, null);

View contentView = LayoutInflater.from(context).inflate(resId, null);

mEditText = contentView.findViewById(android.R.id.edit);

/**
 * From PreferenceDialogFragmentCompat.needInputMethod
 * <p>Note: If your application targets P or above, ensure your subclass manually requests
 * focus (ideally in {@link #onBindDialogView(View)}) for the input field in order to
 * correctly attach the input method to the field.
 */
mEditText.requestFocus();

builder.setView(contentView);

final Dialog dialog = builder.create();
dialog.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

// This is not from PreferenceDialogFragmentCompat and I add it.
// It seems the soft keyboard won't get dismissed on some old devices without this line.
dialog.setOnDismissListener {
    dialog.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}

dialog.show();

Vous n'avez pas besoin de modifier Manifest. Il se concentre automatiquement sur la EditText et sera rejetée si vous cliquez sur les boutons d'action de dialogue ou quelque part en dehors de la boîte de dialogue.

Salut Prepbgg il est en fait une autre façon à ce que vous avez fait. J'ai dû utiliser le mien dans mon ArrayAdapter. Ce que je faisais était passer le contexte de l'activité dans le arrayadapter puis appeler à l'accès getWindow () quelque chose comme ceci:

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);

Dans le code suivant snippet je montre comment héberger un LinearLayout arbitraire dans un DialogFragment. Une aide de AlertDialog (où le clavier logiciel ne fonctionne pas) et une autre façon sans utiliser AlertDialog (où le clavier virtuel fonctionne!):

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");
}

Je trouve cela a fonctionné dans une alerte de dialogue appelé de différents endroits

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

Rappelez-vous que j'ai essayé beaucoup d'autres choses aussi. Semble délicat.

.setView () apportera automatiquement le clavier dans une boîte de dialogue. Notez la « finale » sur le EditText lui-même. IMPORTANT!

AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Random Title...");
alert.setMessage("Type a name");

final EditText input = new EditText(this);

//Set input focus (which opens the android  soft keyboard)
alert.setView(input);   
input.setHint("My Name is...");
//Set keyboard type
input.setInputType(InputType.TYPE_CLASS_TEXT); 

//add button onclick handlers...

alert.show();

Je pense que beaucoup de gens sont vraiment exagérait avec toutes les fonctions ... Ceci est assez universel et grand travail. Et il ne sera pas météorisation votre code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top