J'ai un champ EditText et j'ai défini un OnFocusChangeListener pour cela. Lorsqu'il a perdu le focus, une méthode est appelée, qui vérifie la valeur de EditText avec un dans la base de données. Si la valeur de retour de la méthode est true, un toast est affiché et le focus doit revenir à nouveau sur EditText. Le focus doit toujours revenir sur EditText et le clavier doit s'afficher, jusqu'à ce que la valeur de retour de la méthode soit false.
EDIT: Je pense que je n'ai pas encore clarifié mon vrai problème: aucun autre élément à l'écran ne devrait pouvoir être modifié, jusqu'à ce que la valeur de EditText soit modifiée en une valeur, ce qui rend la méthode "checkLiganame (liganame) "retourne faux. Seul le champ EditText doit être modifiable.
voici mon code (qui ne fonctionne pas pour moi):
final EditText Liganame = (EditText) findViewById(R.id.liganame);
Liganame.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
String liganame = Liganame.getText().toString();
if (checkLiganame(liganame)) {
Toast toast = Toast.makeText(CreateTableActivity.this,
"Dieser Liganame ist bereits vergeben",
Toast.LENGTH_SHORT);
toast.show();
Liganame.requestFocus();
}
}
et la méthode:
public boolean checkLiganame(String liganame) {
boolean found = false;
DatabaseHelper databaseHelper = new DatabaseHelper(this);
SQLiteDatabase db = databaseHelper.getReadableDatabase();
Cursor cursor = db.query("liga", new String[] { "liganame" },
"liganame = '" + liganame + "'", null, null, null, null);
Log.i("Liganame: ", String.valueOf(cursor));
db.close();
if (cursor != null) {
found = true;
}
return found;
}
Ce code conduit au résultat suivant: Une fois que le EditText a perdu le focus, le focus revient à EditText, mais je ne peux plus modifier le texte.
EDIT2: J'ai changé mon code. Scénario:
Je clique sur le premier EditText et y mets une chaîne, qui est déjà dans la base de données. Le toast montre. Maintenant, je ne peux plus modifier ma chaîne. Je clique sur "suivant" sur le clavier et le focus reste sur le premier EditText. J'essaye de modifier ma chaîne, mais rien ne se passe. Au lieu de cela, ma nouvelle chaîne s'affiche dans le deuxième EditText. Je clique sur la flèche arrière de mon appareil et reclique sur le premier et le deuxième EditText -> aucun clavier ne s'affiche.
Voici mon nouveau code:
public class CreateTableActivity extends Activity implements
OnFocusChangeListener {
private EditText Liganame, Mannschaftsanzahl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.create_league);
Liganame = (EditText) findViewById(R.id.liganame);
Liganame.setOnFocusChangeListener(this);
Mannschaftsanzahl = (EditText) findViewById(R.id.mannschaftsanzahl);
Mannschaftsanzahl.setOnFocusChangeListener(this);
final Button save_button = (Button) findViewById(R.id.create_tabelle_speichern_button);
OnClickListener mCorkyListener = new OnClickListener() {
public void onClick(View v) {
ButtonClick();
}
};
save_button.setOnClickListener(mCorkyListener);
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
String liganame = Liganame.getText().toString();
if (checkLiganame(liganame)) {
if (Liganame.requestFocus()) {
getWindow()
.setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Mannschaftsanzahl.clearFocus();
Toast.makeText(CreateTableActivity.this,
"Dieser Liganame ist bereits vergeben",
Toast.LENGTH_SHORT).show();
}
}
}
la source
Réponses:
Mettez simplement cette ligne sur votre
onCreate()
Ça marche pour moi, j'espère que ça aide
la source
Demander la mise au point ne suffit pas pour afficher le clavier.
Pour vous concentrer et afficher le clavier, vous devez écrire quelque chose comme ceci:
EDIT: Ajout d'informations supplémentaires à la réponse après l'ajout de la méthode checkLiganame.
Dans la méthode checkLiganame, vous vérifiez si le curseur est nul. Le curseur renverra toujours un objet, donc la vérification de null ne fait rien. Cependant le problème est dans la ligne
db.close();
Lorsque vous fermez la connexion à la base de données, le
Cursor
devient invalide et est probablement nul.Fermez donc la base de données après avoir récupéré la valeur.
Au lieu de vérifier que le curseur est nul, vous devriez vérifier si le nombre de lignes renvoyées est supérieur à 0: if (cursor.getCount ()> 0) puis définissez votre valeur booléenne sur true si c'est le cas.
EDIT2: Voici donc un code pour le faire fonctionner. EDIT3: Désolé mauvais code j'ai ajouté ...; S
Tout d'abord, vous devez vous concentrer clairement si un autre
EditText
obtient la concentration. Cela peut être fait avecmyEditText.clearFocus()
. Ensuite, dans votre onFocusChangeListener, vous ne devriez pas vraiment vous soucier de savoir si le premierEditText
a le focus ou non, donc le onFocusChangeListener pourrait ressembler à ceci:Remplacez le premier chèque
if(liganame.length() == 0)
par votre propre chèque, alors cela devrait fonctionner. Prenez note que toutes les vues EditText devraient avoir définionFocusChangeListener
le même auditeur que je l'ai fait dans l'exemple.la source
Le code Darwind n'a pas montré le clavier.
Cela fonctionne pour moi:
au cas où le clavier ne s'affiche pas, essayez de forcer:
la source
Cela modifie le focus du EditText lorsque le bouton est cliqué:
la source
Cela fonctionne de moi:
Cacher:
la source
C'est ce qui a fonctionné pour moi, définit le focus et montre également le clavier
la source
setFocusable
nécessite l'API 26. AussisetFocusableInTouchMode
n'était pas nécessaire dans mon cas.Si nous créons dynamiquement un EditText, nous devons définir le requestFocus () comme indiqué ci-dessous.
Si nous avons déjà déclaré le composant dans la vue xml, nous devons le trouver et nous pouvons le focus comme indiqué ci-dessous.
Il définit uniquement le focus sur le composant EditText correspondant.
la source
la source
la source
la source
Vous pouvez le faire avec une seule ligne:
la source
Pour Xamarin.Android, j'ai créé cette extension.
la source
veuillez essayer ce code sur le manifeste
la source
Si vous essayez d'appeler
requestFocus()
avant que la mise en page ne soit gonflée, elle retournera false. Ce code s'exécute une fois la mise en page gonflée. Vous n'avez pas besoin de 200 ms de retard comme mentionné ci - dessus .la source
Je ne sais pas si vous avez déjà trouvé une solution, mais pour votre problème d'édition après avoir demandé à nouveau la mise au point:
Avez-vous essayé d'appeler la méthode
selectAll()
ousetSelection(0)
(si c'est emtpy) sur votre edittext1?S'il vous plaît laissez-moi savoir si cela aide, donc je modifierai ma réponse pour une solution complète.
la source
la source
Si l'utilisation de
requestFocus()
dansonCreate()
introduit le problème du clavier qui ne s'affiche pas au toucher, utilisez enBindingAdapter
utilisant un SingleLiveEvent et demandez le focus à l'intérieur.Voici comment procéder:
BindingAdapter
la source
Ma réponse ici
Comme je l'ai lu sur le document officiel, je pense que c'est la meilleure réponse, il suffit de passer le paramètre View to tel que votre EditText, mais showSoftKeyboard semble ne pas fonctionner sur le paysage
la source