Android: forcer EditText à supprimer focus? [dupliquer]
cette question a déjà une réponse ici:
- Stop EditText de gagner de l'accent à l'Activité de démarrage 46 réponses
je voudrais pouvoir supprimer le focus de L'EditText. Par exemple, si le Clavier s'affiche et l'utilisateur cache avec le bouton de retour, je voudrais l'accent et le curseur à disparaître. Comment peut-il être fait?
19 réponses
vous pouvez ajouter cela à onCreate
et il cachera le clavier chaque fois que l'activty commence.
vous pouvez également programmatically changer le foyer à un autre élément.
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Vous pouvez faire de curseur et de se concentrer disparaître par
edittext.clearFocus();
mais détecter quand le cache de carte est un travail difficile.
ajouter LinearLayout
avant EditText
dans votre 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 à view 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" />
Supprimer focus mais rester focalisable:
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);
EditText perdra la mise au point, mais pourra la gagner à nouveau sur un nouvel événement tactile.
remove autofocus edittext android
ça marche pour moi
Edit dans le lien qu'ils suggèrent d'utiliser LinearLayout, mais simple View will work
<View
android:id="@+id/focus_thief"
android:layout_width="1dp"
android:layout_height="1dp"
android:focusable="true"
android:focusableInTouchMode="true" />
alors si ce" voleur "est placé en haut de la mise en page (pour être le premier élément focalisable) les appels à clearFocus()
fonctionneront.
ajouter ces deux propriétés à votre disposition mère (ex: Layout linéaire, Layout relatif)
android:focusable="true"
android:focusableInTouchMode="true"
Il va faire le tour :)
vous pouvez également inclure android:windowSoftInputMode=" statewayshidden " dans votre section d'action manifeste.
équivalent à:
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
mais de manière XML.
POUR INFO, vous pouvez aussi cacher le clavier avec les codes:
// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);
vous devez supprimer <requestFocus/>
si vous ne l'utilisez pas et toujours le même problème
utilisateur LinearLayout
en tant que parent et réglez
android:focusable="true"
android:focusableInTouchMode="true"
J'espère que ça vous aidera.
essayez d'utiliser celui-ci sur votre vue 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"/>
ajoutez à votre mise en page mère où Avez-vous mis votre EditText
ce android:focusableInTouchMode="true"
pour cacher le clavier quand l'activité commence.. Ecrire le code suivant dans onCreate()..
InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
pour clarifier la mise au point et supprimer le curseur d'edittext.....
editText.clearFocus();
editText.setCursorVisible(false);
C'est ma toute première réponse sur SO, donc ne soyez pas trop sévère avec moi s'il y a des erreurs. : D
il y a peu de réponses qui flottent autour du SO, mais je sens l'envie de poster ma solution complète car cela m'a rendu fou. J'ai pris des bouts et des morceaux de tout autour donc pardonnez-moi si Je ne donne pas les crédits respectifs à tout le monde... :)
(je vais simplifier mon résultat parce que mon point de vue a trop d'éléments et je ne veux pas spam avec cela et essaiera pour le rendre aussi générique que possible...)
pour votre mise en page vous avez besoin d'un parent votre EditText et vue de parent 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 trucs ici. J'avais besoin d'avoir un Placeholder pour mon EditText - qui est cela -
android:hint="astuce"
Aussi,
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
fait pour EditText de ne pas être porté sur la saisie de la Activité et plus tard dans le Activité lui-même lorsque le réglage de ce paramètre permet de sorte que vous pouvez définir onTouchListener pour voler de l'accent mis sur 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é sur cette page de questions, et la partie avec la solution D'activité que j'ai trouvé sur ce blog . Le reste que j'ai manqué que j'ai dû comprendre moi-même était clair focus sur le EditText que j'ai ajouté à la fois à l'intérieur du setOnEditorActionListener et onTouchLister pour le parent view .
Espérons que cela aide quelqu'un et enregistre leur temps. :)
santé, Z.
dans les commentaires vous avez demandé si une autre vue peut être focalisée au lieu du texte D'édition. Oui, il peut. Utiliser .requestFocus()
méthode pour la vue que vous voulez être porté au début (dans onCreate ())
également focalisation autre vue découpera une certaine quantité de code. (code pour cacher le clavier par exemple)
j'ai eu le même problème. Elle m'a fait le plus de fou.
j'ai eu un dialogue étendu avec un ScrollView qui avait un TableLayout avec un LinearLayout étendu qui contenait une SeekBar et un EditText.
le premier texte édité avait toujours l'autofocus après avoir montré le dialogue et après avoir édité le texte sur le clavier le texte édité avait toujours le focus et le clavier était encore visible.
j'ai essayé presque toutes les solutions de ce fil et aucun 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;
}
});
d'ailleurs, I n'a pas utilisé l'un des snippets suivants pour le résoudre:
//setFocusableInTouchMode( true )
//setFocusable( true )
//setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )
ET je ne utilisé une entretoise élément comme une Vue avec la largeur et la hauteur de 1dp.
Espérons que cela aide quelqu'un :D
editText.setFocusableInTouchMode(true)
Le EditText
sera en mesure d'obtenir le focus lorsque l'utilisateur touche.
Lorsque la page principale (activité, dialogue, etc.) devient visible le EditText
n'obtient pas automatiquement la mise au point même s'il s'agit de la première vue dans la mise en page.
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 à" blocksDescendants " bloque l'attention sur les éléments enfants.
vous pouvez trouver plus d'informations ici .
check your xml file
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp" >
**<requestFocus />**
</EditText>
//Remove **<requestFocus />** from xml