web-dev-qa-db-fra.com

Affichage du curseur dans EditText lorsque la focalisation n'est pas sur EditText

Image of a grid-like layout

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é:

    • Lorsque l'utilisateur tape avec le clavier (en cliquant avec une télécommande), le curseur doit également clignoter dans la variable editText.

Comment puis-je afficher cet effet dans la EditText?

17
nitin tyagi

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...

5
DJphy

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:

  1. 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;
        ...
    }
    
  2. Le curseur ne sera pas toujours visible. Le clignotement du curseur est basé sur l’heure du système. Il est visible pendant une demi-seconde et caché pendant une demi-seconde. Le curseur ne sera visible que si le code que j'ai suggéré ci-dessus est appelé à un moment donné où le curseur serait visible en fonction de l'heure système.

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);
    }
}
4
Ovidiu

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"
4
IntelliJ Amiya

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);
}
2
James King
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"
1
jessica

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.

1
Jeffrey Blattman

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);
1
Rohit Sharma

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.

1
Keshav1234
    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.

0
Maddy_Rockstar