J'aimerais pouvoir supprimer le focus de EditText. Par exemple, si le clavier apparaît et que l'utilisateur le cache avec le bouton Précédent, je souhaite que le focus et le curseur disparaissent. Comment ceci peut être fait?
Vous pouvez ajouter ceci à onCreate
et il cachera le clavier à chaque démarrage de l'activité.
Vous pouvez également modifier le focus par programme sur un autre élément.
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Vous pouvez faire disparaître le curseur et la mise au point par
edittext.clearFocus();
Mais détecter quand le clavier se cacher est un travail difficile.
Ajoutez LinearLayout
avant EditText
dans votre fichier XML.
<LinearLayout
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:clickable="true"
Android:layout_width="0px"
Android:layout_height="0px" />
Ou vous pouvez faire la même chose en ajoutant ces lignes à afficher avant votre 'EditText'.
<Button
Android:id="@+id/btnSearch"
Android:layout_width="50dp"
Android:layout_height="50dp"
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:gravity="center"
Android:text="Quick Search"
Android:textColor="#fff"
Android:textSize="13sp"
Android:textStyle="bold" />
<EditText
Android:id="@+id/edtSearch"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:layout_centerVertical="true"
Android:layout_marginRight="5dp"
Android:gravity="left"
Android:hint="Name"
Android:maxLines="1"
Android:singleLine="true"
Android:textColorHint="@color/blue"
Android:textSize="13sp"
Android:textStyle="bold" />
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);
EditText perd le focus, mais peut le gagner à nouveau lors d'un nouvel événement tactile.
supprimer l'autofocus edittext Android
Ça marche pour moi
Modifier Dans le lien proposé, ils suggèrent d'utiliser LinearLayout, mais une vue simple fonctionnera
<View
Android:id="@+id/focus_thief"
Android:layout_width="1dp"
Android:layout_height="1dp"
Android:focusable="true"
Android:focusableInTouchMode="true" />
Ensuite, si ce "voleur" est placé en haut de la présentation (pour être le premier élément activable), les appels à clearFocus()
fonctionneront.
Ajoutez ces deux propriétés à votre mise en page parent (ex: mise en page linéaire, mise en page relative)
Android:focusable="true"
Android:focusableInTouchMode="true"
Ça va faire l'affaire :)
Vous pouvez également inclure Android: windowSoftInputMode = "stateAlwaysHidden" dans votre section d'action manifeste.
Ceci est équivalent à:
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
mais de manière XML.
Pour votre information, vous pouvez également masquer le clavier avec des codes:
// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);
essayez d'utiliser celui-ci à votre avis, cela a fonctionné pour moi:
<View
Android:id="@+id/fucused"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:focusable="true"
Android:focusableInTouchMode="true"/>
vous devez enlever <requestFocus/>
si vous ne l'utilisez pas et toujours le même problème
utilisateur LinearLayout
en tant que parent et défini
Android:focusable="true"
Android:focusableInTouchMode="true"
J'espère que ça vous aidera.
Pour masquer le clavier au démarrage de l'activité, écrivez le code suivant dans onCreate () ..
InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
Pour effacer le focus et supprimer le curseur de edittext .....
editText.clearFocus();
editText.setCursorVisible(false);
Ajoutez à votre mise en page parent où avez-vous mis votre EditText
this Android:focusableInTouchMode="true"
Ceci est ma toute première réponse sur SO, alors ne soyez pas trop sévère avec moi s'il y a des erreurs. :RÉ
Il y a peu de réponses qui circulent autour du SO, mais je sens l'envie de publier ma solution complète car cela m'a rendu fou. J'ai attrapé des morceaux de partout, alors pardonnez-moi si je ne donne pas de crédits respectifs à tout le monde ... :)
(Je simplifierai mon résultat car mon point de vue contient trop d'éléments et je ne veux pas du spam avec ça et je vais essayer de le rendre aussi générique que possible ...)
Pour votre mise en page, vous avez besoin d'un parent votre EditText et parent vue défini quelque chose comme ceci:
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/lytContainer"
Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true">
<EditText Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:id="@+id/etEditor"
Android:inputType="number"
Android:layout_gravity="center"
Android:hint="@string/enter_your_text"
Android:textColor="@Android:color/darker_gray"
Android:textSize="12dp"
Android:textAlignment="center"
Android:gravity="center"
Android:clickable="true"/>
</LinearLayout>
Donc, j'avais besoin de quelques choses ici. Je devais avoir un espace réservé pour mon EditText - qui est-ce -
Android: indice = "indice"
Aussi,
Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true"
fait en sorte que EditText ne soit pas concentré sur l'entrée Activity et plus tard dans Activity lui-même lorsque vous le définissez, ce paramètre vous permet de définir onTouchListener sur celui-ci de manière à dérober le focus EditText .
Maintenant, dans l'activité:
package com.at.keyboardhide;
import Android.app.Activity;
import Android.content.Context;
import Android.os.Bundle;
import Android.view.MotionEvent;
import Android.view.View;
import Android.view.WindowManager;
import Android.view.View.OnTouchListener;
import Android.view.inputmethod.InputMethodManager;
import Android.widget.EditText;
import Android.widget.LinearLayout;
public class MainActivity extends Activity implements OnTouchListener{
private EditText getEditText;
private LinearLayout getLinearLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
setContentView(R.layout.keyboardmain);
getEditText = (EditText)findViewById(R.id.etEditor);
getLinearLayout = (LinearLayout)findViewById(R.id.lytContainer);
getLinearLayout.setOnTouchListener(this);
getEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
Log.d("EDTA", "text was entered.");
getEditText.clearFocus();
imm.hideSoftInputFromWindow(barcodeNo.getWindowToken(), 0);
return true;
}
return false;
}
});
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if(v==getLinearLayout){
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getEditText.getWindowToken(), 0);
getEditText.clearFocus();
return true;
}
return false;
}
}
Peu de réponses pour les bits que j'ai trouvés sur cette page de question, et la partie avec la solution d'activité que j'ai trouvée sur ce blog . Le reste qui me manquait et que je devais comprendre moi-même, c’était éclaircir le focus sur le EditText que j’ai ajouté aux deux dans le setOnEditorActionListener et onTouchLister pour la vue parent .
J'espère que cela aide quelqu'un et lui fait gagner du temps. :)
À la vôtre, Z.
Dans les commentaires, vous avez demandé si une autre vue pouvait être utilisée au lieu de EditText. Oui il peut. Utilisez la méthode .requestFocus()
pour la vue que vous souhaitez mettre en évidence au début (dans la méthode onCreate ())
Si vous vous concentrez sur une autre vue, vous couperez du code. (code pour cacher le clavier par exemple)
J'ai eu le même problème. Cela m'a rendu plus que fou.
J'avais un dialogue étendu avec une ScrollView qui avait un TableLayout avec un LinearLayout étendu qui contenait un SeekBar et un EditText.
Le premier EditText avait toujours l'autofocus après avoir montré la boîte de dialogue et une fois l'édition du texte terminée au clavier, EditText avait toujours le focus et le clavier était toujours visible.
J'ai essayé presque toutes les solutions de ce fil et aucune n'a fonctionné pour moi.
Alors voici mon solution simple: (text = EditText)
text.setOnEditorActionListener( new OnEditorActionListener( ){
public boolean onEditorAction( TextView v, int actionId, KeyEvent event ){
if( (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) ||
(actionId == EditorInfo.IME_ACTION_DONE) ){
text.clearFocus( );
InputMethodManager iMgr = null;
iMgr = (InputMethodManager)mContext.getSystemService( Context.INPUT_METHOD_SERVICE );
iMgr.hideSoftInputFromWindow( text.getWindowToken(), 0 );
}
return true;
}
});
À propos, j'ai non utilisé l'un des extraits suivants pour le résoudre:
//setFocusableInTouchMode( true )
//setFocusable( true )
//setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )
AND I non a utilisé un élément d'espacement tel qu'une vue avec une largeur et une hauteur de 1dp.
Espérons que cela aide quelqu'un: D
Vous pouvez également inclure Android:windowSoftInputMode="stateAlwaysHidden"
dans votre section d'action manifeste.
Ceci est équivalent à:
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
editText.setFocusableInTouchMode(true)
Le EditText
pourra obtenir le focus lorsque l'utilisateur le touchera. Lorsque la disposition principale (activité, boîte de dialogue, etc.) devient visible, la EditText
ne reçoit pas automatiquement le focus, même s'il s'agit de la première vue de la disposition.
EditText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View view, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(URLText.getWindowToken(), 0);
EditText.setFocusable(false);
EditText.setFocusableInTouchMode(true);
return true;
} else {
return false;
}
}
});
Vous pouvez éviter toute focalisation sur vos éléments en définissant l'attribut Android: descendantFocusability de l'élément parent.
Voici un exemple:
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/search__scroller"
Android:descendantFocusability="blocksDescendants"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_alignParentLeft="true"
Android:layout_alignParentTop="true" >
</ScrollView>
Ici, l'attribut Android: descendantFocusability défini sur "blocksDescendants" bloque le focus sur les éléments enfants.
Vous pouvez trouver plus d'informations ici .