Je travaille sur l'application Android Smart TV:
Dans une view
, il y a un clavier personnalisé et une EditText
.
Lorsque l'application démarre, le focus est dirigé vers le clavier.
Souhaité:
editText
.Comment puis-je afficher cet effet dans la EditText
?
vous pouvez le faire..j’espère/pense que vous avez une disposition pour les boutons que vous avez créés, vous pouvez ainsi définir un écouteur de focus pour cette disposition et à l’intérieur de la méthode onFocusChange, vous pouvez vérifier if (layout.hasFocus ()) et le faire ...
Par exemple, si ur edittext est nommé et, vous pouvez le définir comme suit:
et.setActivated(true);
et.setPressed(true);
J'ai un petit exemple de code pour u ayant deux textes d'édition
et2.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(et2.hasFocus()){
//et1.setCursorVisible(true);
et1.setActivated(true);
et1.setPressed(true);
}
}
});
J'espère que cela t'aides...
Vous pouvez essayer quelque chose comme ça:
editText.setText(text);
editText.setPressed(true);
editText.setSelection(editText.getText().length()); // moves the cursor to the end of the text
Cependant, cette approche pose deux problèmes:
Le curseur ne clignotera pas. La logique du clignotement est dans la classe Editor et ne peut pas être remplacée. Il faut que le texte d'édition soit concentré et qu'une seule vue puisse être focalisée en même temps dans une fenêtre - dans votre cas, ce sera l'un des boutons du clavier.
/**
* @return True when the TextView isFocused and has a valid zero-length selection (cursor).
*/
private boolean shouldBlink() {
if (!isCursorVisible() || !mTextView.isFocused()) return false;
...
}
C'est pourquoi le clavier/IME natif fonctionne comme il le fait. Il s’agit d’une fenêtre distincte qui permet à l’EditText de conserver le focus et d’avoir la fonctionnalité de curseur clignotant, tandis que l’utilisateur appuie sur des vues dans une autre fenêtre (le clavier/IME).
Cela étant dit, il existe une solution de contournement pour les problèmes ci-dessus - assurez-vous de définir false pour shouldBlink lorsque vous n'en avez plus besoin, il s'agit d'une fuite de mémoire garantie ou d'un crash, sinon:
private void blink() {
if (shouldBlink) {
editText.setText(editText.getText());
editText.setPressed(true);
editText.setSelection(editText.getText().length());
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (shouldBlink) {
blink();
}
}
}, 500);
}
}
Cela se produit si vous définissez un arrière-plan pour le champ. Si vous voulez résoudre ce problème, définissez cursorDrawable
sur @null
.
Vous devez ajouter textCursorDrawable
avec cursorVisible
.
Référence à un dessin qui sera dessiné sous le curseur d’insertion.
Android:cursorVisible="true"
Android:textCursorDrawable="@null"
Il y a deux façons de le faire:
1) XML
Android:cursorVisible="true"
2) Java
mEditText.setOnClickListener(editTextClickListener);
OnClickListener editTextClickListener = new OnClickListener() {
public void onClick(View v) {
if (v.getId() == mEditText.getId()) {
mEditText.setCursorVisible(true);
}
}
};
or
if (mEditText.hasFocus()){
mEditText.setCursorVisible(true);
}
You can explicitly put caret to last position in text:
int pos = editText.getText().length();
editText.setSelection(pos);
Cela se concentrera toujours sur le premier caractère sur edittext.
Android:focusable="true"
Je sais que c'est necro, mais c'était beaucoup mieux que les solutions ci-dessus. Il suffit d'étendre EditText
et d'ajouter:
@Override
public boolean isCursorVisible() {
return true;
}
@Override
public boolean isFocused() {
return true;
}
Et dans votre XML:
<com.foo.MyEditText
...
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:clickable="false"
Android:cursorVisible="true"/>
Maintenant, la EditText
pense qu'elle est focalisée et que le curseur est visible, mais en réalité, elle ne peut pas être focalisée.
Vous pouvez utiliser le code suivant dans votre activité:
//Get the EditText using
EditText et = (EditText)findViewById(R.id.editText);
//Set setCursorVisible to true
et.setCursorVisible(true);
Dans votre fichier XML de mise en page, ajoutez la ligne suivante dans votre texte d'édition:
<requestFocus/>
Cela placera le curseur dans votre widget editText.
J'espère que ça aide.
private void setFocusCursor(){
mBinding.replyConversationsFooter.footerEditText.setFocusable(true);
`mBinding.replyConversationsFooter.footerEditText.setFocusableInTouchMode(true);`
`mBinding.replyConversationsFooter.footerEditText.requestFocus();`
}
Il suffit d'appeler cette fonction dans oncreateView () et le tour est joué… .. Nous ne pouvons définir qu'un seul et unique focus sur une fenêtre.Cela vous aidera à résoudre votre problème.