J'ai une mise en page qui contient des vues comme celle-ci:
<LinearLayout>
<TextView...>
<TextView...>
<ImageView ...>
<EditText...>
<Button...>
</linearLayout>
Comment puis-je définir le focus (afficher le clavier) sur mon EditText
programme?
J'ai essayé cela et cela ne fonctionne que lorsque je lance mon Activity
normalement, mais lorsque je le lance dans un TabHost
, cela ne fonctionne pas.
txtSearch.setFocusableInTouchMode(true);
txtSearch.setFocusable(true);
txtSearch.requestFocus();
android
focus
android-edittext
Houcine
la source
la source
Réponses:
Essaye ça:
http://developer.android.com/reference/android/view/View.html#requestFocus ()
la source
utilisation:
la source
View
sous - classe)imm.showSoftInput()
ça ne marche pas.Cela a fonctionné pour moi, grâce aux ungalcrys
Afficher le clavier:
editText = (EditText)findViewById(R.id.myTextViewId); editText.requestFocus(); InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);
Masquer le clavier:
InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
la source
showSoftInput
ne fonctionnait pas du tout pour moi.J'ai pensé que j'avais besoin de définir le mode d'entrée:
android:windowSoftInputMode="stateVisible"
(ici dans le composant Activité du manifeste)J'espère que cette aide!
la source
final EditText tb = new EditText(this); tb.requestFocus(); tb.postDelayed(new Runnable() { @Override public void run() { InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.showSoftInput(tb, InputMethodManager.SHOW_IMPLICIT); } }, 1000);
la source
tb.post({ showKeyboard(tb) })
). Notez que nous avons besoin d'une vue EditText (tb
), pas d'une vue fragmentée.Voici comment créer une extension kotlin pour afficher et masquer le clavier virtuel:
fun View.showKeyboard() { this.requestFocus() val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) } fun View.hideKeyboard() { val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager inputMethodManager.hideSoftInputFromWindow(windowToken, 0) }
Ensuite, vous pouvez simplement faire ceci:
editText.showKeyboard() // OR editText.hideKeyboard()
la source
Je recommande d'utiliser un LifecycleObserver qui fait partie de la gestion des cycles de vie avec les composants Lifecycle-Aware d' Android Jetpack .
Je souhaite ouvrir et fermer le clavier lorsque le fragment / l'activité apparaît. Tout d'abord, définissez deux fonctions d'extension pour EditText. Vous pouvez les placer n'importe où dans votre projet:
fun EditText.showKeyboard() { requestFocus() val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) } fun EditText.hideKeyboard() { val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(this.windowToken, 0) }
Définissez ensuite un LifecycleObserver qui ouvre et ferme le clavier lorsque l'activité / fragment atteint
onResume()
ouonPause
:class EditTextKeyboardLifecycleObserver(private val editText: WeakReference<EditText>) : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun openKeyboard() { editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 100) } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun closeKeyboard() { editText.get()?.hideKeyboard() } }
Ajoutez ensuite la ligne suivante à l'un de vos fragments / activités, vous pouvez réutiliser le LifecycleObserver à tout moment. Par exemple pour un fragment:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // inflate the Fragment layout lifecycle.addObserver(EditTextKeyboardLifecycleObserver(WeakReference(myEditText))) // do other stuff and return the view }
la source
Voici la classe KeyboardHelper pour cacher et afficher le clavier
import android.content.Context; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; /** * Created by khanhamza on 06-Mar-17. */ public class KeyboardHelper { public static void hideSoftKeyboard(final Context context, final View view) { if (context == null) { return; } view.requestFocus(); view.postDelayed(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); assert imm != null; imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } }, 1000); } public static void hideSoftKeyboard(final Context context, final EditText editText) { editText.requestFocus(); editText.postDelayed(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); assert imm != null; imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } }, 1000); } public static void openSoftKeyboard(final Context context, final EditText editText) { editText.requestFocus(); editText.postDelayed(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); assert imm != null; imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); } }, 1000); } }
la source
J'ai essayé la meilleure réponse de David Merriman et cela n'a pas non plus fonctionné dans mon cas. Mais j'ai trouvé la suggestion d'exécuter ce code retardée ici et cela fonctionne comme un charme.
val editText = view.findViewById<View>(R.id.settings_input_text) editText.postDelayed({ editText.requestFocus() val imm = context.getSystemService(INPUT_METHOD_SERVICE) as? InputMethodManager imm?.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT) }, 100)
la source
Première manière :
etPassword.post(() -> { etPassword.requestFocus(); InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); manager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT); });
Deuxième manière :
Dans le manifeste:
<activity android:name=".activities.LoginActivity" android:screenOrientation="portrait" android:windowSoftInputMode="stateVisible"/>
Dans du code:
etPassword.requestFocus();
la source
J'ai essayé de nombreuses façons et cela ne fonctionne pas, je ne suis pas sûr que ce soit parce que j'utilise la transition partagée du fragment à l'activité contenant le texte d'édition.
Btw mon edittext est également enveloppé dans LinearLayout.
J'ai ajouté un léger retard pour demander la mise au point et le code ci-dessous a fonctionné pour moi: (Kotlin)
et_search.postDelayed({ editText.requestFocus() showKeyboard() },400) //only 400 is working fine, even 300 / 350, the cursor is not showing
showKeyboard ()
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
la source
editTxt.setOnFocusChangeListener { v, hasFocus -> val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager if (hasFocus) { imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY) } else { imm.hideSoftInputFromWindow(v.windowToken, 0) } }
la source
Je n'ai pas réussi à faire fonctionner toutes ces réponses par elles-mêmes. La solution pour moi était de les combiner:
Je ne sais pas pourquoi cela était nécessaire pour moi - selon la documentation, il semble que l'une ou l'autre méthode aurait dû fonctionner seule.
la source