J'ai un EditText-Field et définissez un OnFocusChangeListener pour cela. Quand il a perdu le focus, une méthode est appelée, qui vérifie la valeur de EditText avec une 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 sur le texte d'édition. Le focus devrait toujours revenir sur EditText et le clavier devrait s'afficher jusqu'à ce que la valeur de retour de la méthode soit false.
EDIT: Je pense que je n’ai pas encore parfaitement expliqué mon vrai problème: aucun autre élément de l’écran ne devrait pouvoir être modifié, tant que la valeur de EditText n’est pas modifiée, ce qui rend la méthode "checkLiganame (liganame) "retourne faux. Seul le champ EditText doit être éditable.
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 l'éditeur a perdu le focus, le focus revient à EditText, mais je ne peux plus modifier le texte.
EDIT2: 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 pain grillé est visible. Maintenant, je ne peux plus éditer ma chaîne. Je clique sur "Suivant" sur le clavier et le focus reste sur le premier EditText. J'essaie de modifier ma chaîne, mais rien ne se passe. Au lieu de cela ma nouvelle chaîne est affichée dans le deuxième EditText. Je clique sur la flèche arrière de mon appareil et reclique sur les premier et deuxième EditText -> aucun clavier n'est affiché.
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();
}
}
}
Il suffit de mettre cette ligne sur votre onCreate()
editText.requestFocus();
Ça marche pour moi, j'espère que ça aide
Demander le focus n'est pas suffisant pour afficher le clavier.
Pour obtenir le focus et montrer au clavier, vous écririez quelque chose comme ceci:
if(myEditText.requestFocus()) {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
EDIT: Ajouter des 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 null. Le curseur retournera 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, la variable Cursor
devient invalide et très probablement annulée.
Fermez la base de données après avoir récupéré la valeur.
Au lieu de rechercher le curseur comme étant nul, vous devez 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 tel est le cas.
EDIT2: Alors, voici un code pour savoir comment le faire fonctionner . EDIT3: Désolé, le code erroné que j’ai ajouté ...; S
Tout d’abord, vous devez effacer le focus si un autre EditText
obtient le focus. Cela peut être fait avec myEditText.clearFocus()
. Ensuite, dans votre onFocusChangeListener, vous ne devriez pas vous soucier de savoir si la première variable EditText
a le focus ou pas, le onFocusChangeListener pourrait alors ressembler à ceci:
public class MainActivity extends Activity implements OnFocusChangeListener {
private EditText editText1, editText2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText1 = (EditText) findViewById(R.id.editText1);
editText1.setOnFocusChangeListener(this);
editText2 = (EditText) findViewById(R.id.editText2);
editText2.setOnFocusChangeListener(this);
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
String liganame = editText1.getText().toString();
if(liganame.length() == 0) {
if(editText1.requestFocus()) {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
editText2.clearFocus();
Toast.makeText(MainActivity.this, "Dieser Liganame ist bereits vergeben", Toast.LENGTH_SHORT).show();
}
}
}
}
Remplacez la première vérification if(liganame.length() == 0)
par votre propre vérification, elle devrait alors fonctionner. Notez que toutes les vues EditText doivent avoir défini leur onFocusChangeListener
sur le même écouteur que je l’ai déjà fait dans l’exemple.
Le code de Darwind n'a pas montré le clavier.
Cela fonctionne pour moi:
_searchText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT);
si le clavier ne s'affiche pas, essayez de forcer:
imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);
Cela modifie le focus du EditText quand le bouton est cliqué:
public class MainActivity extends Activity {
private EditText e1,e2;
private Button b1,b2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
e1=(EditText) findViewById(R.id.editText1);
e2=(EditText) findViewById(R.id.editText2);
e1.requestFocus();
b1=(Button) findViewById(R.id.one);
b2=(Button) findViewById(R.id.two);
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
e1.requestFocus();
}
});
b2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
e2.requestFocus();
}
});
}
}
Si nous créons un EditText de manière dynamique, nous devons définir le requestFocus () comme indiqué ci-dessous.
EditText editText = new EditText(this);
editText.setWidth(600);
editText.requestFocus();
Si nous avons déjà déclaré le composant dans la vue XML, nous devons le trouver et nous pouvons le mettre en évidence comme indiqué ci-dessous.
EditText e1=(EditText) findViewById(R.id.editText1);
e1.requestFocus();
Il active uniquement le composant EditText correspondant.
Cela fonctionne de moi:
public void showKeyboard(final EditText ettext){
ettext.requestFocus();
ettext.postDelayed(new Runnable(){
@Override public void run(){
InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInput(ettext,0);
}
}
,200);
}
Cacher:
private void hideSoftKeyboard(EditText ettext){
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}
mEditText.setFocusableInTouchMode(true);
mEditText.requestFocus();
if(mEditText.requestFocus()) {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
C’est ce qui a fonctionné pour moi, met le focus et montre le clavier aussi
EditText userNameText = (EditText) findViewById(R.id.textViewUserNameText);
userNameText.setFocusable(true);
userNameText.setFocusableInTouchMode(true);
userNameText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(userNameText, InputMethodManager.SHOW_IMPLICIT);
Button btnClear = (Button) findViewById(R.id.btnClear);
EditText editText1=(EditText) findViewById(R.id.editText2);
EditText editText2=(EditText) findViewById(R.id.editText3);
btnClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editText1.setText("");
editText2.setText("");
editText1.requestFocus();
}
});
private void requestFocus(View view) {
if (view.requestFocus()) {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
//Function Call
requestFocus(yourEditetxt);
Pour Xamarin.Android, j'ai créé cette extension.
public static class ViewExtensions
{
public static void FocusEditText(this EditText editText, Activity activity)
{
if (editText.RequestFocus())
{
InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService);
imm.ShowSoftInput(editText, ShowFlags.Implicit);
}
}
}
s'il vous plaît essayez ce code sur manifeste
<activity Android:name=".EditTextActivity" Android:windowSoftInputMode="stateAlwaysVisible">
</activity>
new OnEditorActionListener(){
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
editText.requestFocus();
//used ******* return true ******
return **true**;
}
}
Je ne sais pas si vous avez déjà trouvé une solution, mais pour votre problème de montage après avoir de nouveau demandé le focus:
Avez-vous essayé d'appeler la méthode selectAll()
ou setSelection(0)
(si est vide) sur votre edittext1?
S'il vous plaît laissez-moi savoir si cela aide, alors je vais modifier ma réponse à une solution complète.
Vous pouvez le faire avec une seule ligne:
yourEditText.RequestFocusFromTouch();
Vous pouvez utiliser ce code
txt_Mob.setOnFocusChangeListener(new View.OnFocusChangeListener(){
@Override
public void onFocusChange(View view, boolean b) {
if (b){
//IsFocus
}else{
//IsNotFocus
}
}
});