Salut,
je suis actuellement en train de faire une application Android et je me trouve devant un problème.
Je dois taper un nombre qui sera mon budget. Je crée donc un EditText :
1 2 3 4 5 6 7 8 9 10 | <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="numberDecimal" android:ems="10" android:id="@+id/editBudget" android:layout_row="0" android:layout_column="1" android:hint="42.42" /> |
Jusque là tout va bien. Lorsque je prends le focus de l'EditText, le clavier virtuel s'affiche, j'entre mon nombre et j'appuie sur "OK", et mon clavier s'en va. Oui mais voilà : ce nombre, je dois le dispatcher dans mon modèle lorsque l'appui sur OK est fait. Or, actuellement, il faut qu'un autre événement ait lieu pour que ça fonctionne, par exemple, l'appui sur ce bouton déclanche un listener qui lit la valeur du budget :
1 2 3 4 5 6 7 8 9 10 | <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Générer ma liste de courses" android:id="@+id/validate_search" android:layout_row="3" android:paddingBottom="5px" android:layout_marginLeft="25px" android:layout_marginBottom="5px" android:layout_column="0" /> |
J'ai donc fait quelques recherches et suis arrivé à deux "solutions" proposées :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | final EditText budget = (EditText)view.findViewById(R.id.editBudget); budget.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { try { parentActivity.getShopList().setBudget(Float.valueOf(budget.getText().toString())); }catch (Exception e){ budget.setText("0"); } } }); |
Celle-ci ne fonctionne pas car elle appelle la callback à chaque changement de nombre et modifie donc mon modèle même quand j'ajoute ou enlève un chiffre, ce qui est gênant puisqu'en cas de budget trop bas, mon modèle notifie un objet qui lance une popup d'avertissement (idem pour budget très élevé).
J'ai donc tenté le code qu'on trouve ici:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ((EditText)findViewById(R.id.youredittext)).setOnEditorActionListener( new EditText.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { if (!event.isShiftPressed()) { // the user is done typing. return true; // consume. } } return false; // pass on to other listeners. } }); |
Mais il semblerait que la galaxy tab qui me serve de device de test ne prenne pas en compte l'option actionId == EditorInfo.IME_ACTION_DONE
.
Sauriez-vous comment gérer ça?