web-dev-qa-db-fra.com

Comment rendre le texte édité non éditable, mais cliquable dans JAVA

Est-il possible de rendre EditText cliquable mais non modifiable?.

Je ne veux pas que ce soit éditable (le clavier ne devrait pas non plus apparaître ni nous ne devrions pouvoir changer l'indice)

En fait, je veux utiliser Edit text simplement comme une image avec un indice (qui ne peut pas être changé). Je sais que la méthode réelle consistait à utiliser une variable ImageView et une variable TextView, mais je veux qu'elle essaye avec EditText car je n'utiliserai alors qu'une seule vue au lieu de 2. De plus, tout est dynamique, donc aucun XML.

Pour la condition ci-dessus, la solution en XML est Android:editable="false" mais je souhaite l’utiliser en Java.

Mais,

Si j'utilise: - 

et.setEnabled(false);

ou

 et.setKeyListener(null);

Cela rend la EditText non ÉDITABLE, mais en même temps, elle est également non cliquable.

63
Aamir Shah

Le truc ici est: - 

et.setFocusable(false);
et.setClickable(true);
125
Aamir Shah

vous pouvez définir EditText en utilisant le code Java comme suit: -

edittext.setFocusable(false);
edittext.setClickable(true);

ou en utilisant le code ci-dessous dans le fichier XML pour EditText.

Android:editable="false" 
Android:inputType="none"  
17
abhi

Vous pouvez utiliser ceci ..

Android:focusableInTouchMode="false"

pour rendre edittext non éditable dans xml.And et pour un événement cliquable, vous pouvez utiliser setOnTouchListener () event pour faire la même chose que.

editText.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
                        //do your stuff here..
        return false;
    }
});
7
ridoy

Android:editable est obsolète mais vous pouvez faire comme ci-dessous:

Android:editable="false"
Android:focusable="false"
Android:focusableInTouchMode="false"

J'ai utilisé le cade ci-dessus pour les éditions que j'utilise avec des sélecteurs pour définir les données. Vous pouvez utiliser la disposition d'entrée avec cela.

4
savepopulation

Comme editable est obsolète. vous pouvez utiliser Android:inputType comme none lors de la conception de xml ou comme InputType.TYPE_NULL dans le codage.

Concevoir du XML

<Android.support.v7.widget.AppCompatEditText
    Android:id="@+id/edt"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:clickable="true"
    Android:focusable="false"
    Android:inputType="none"
    Android:text="EditText"/>

Codage

edt.setClickable(true);
edt.setFocusable(false);
edt.setInputType(InputType.TYPE_NULL);

Et ci-dessous se trouve l'événement click de edittext

edt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(YourActivity.this,"edt click", Toast.LENGTH_LONG).show();
    }
});
3
Nirav Bhavsar

Edittext activer et désactiver pour l'édition comme celle-ci

EditText edit = (EditText) findviewby(R.id.edittext);

À travers le code Java

edit.setEnabled(false); //non editable
edit.setEnabled(true); //editable

À travers xml

<EditText
    Android:id="@+id/otp_mpin"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:editable="false"
    Android:focusable="false"/>
1
Kishore Reddy

Peut-être que vous pouvez essayer 

editText.setEnabled(false);
1
默默磊OK

Pour moi, aucune des réponses n'a abouti à une solution totalement opérationnelle. 

Présentation de mon correctif https://www.youtube.com/watch?v=oUA4Cuxfdqc

Guide (noob-friendly), veuillez noter les quelques commentaires dans le code.

Créez une classe Java pour une EditText personnalisée appelée EditTextDispatched.Java

import Android.content.Context;
import Android.util.AttributeSet;
import Android.view.MotionEvent;
import Android.widget.RelativeLayout;

/**
 * @author Martin Pfeffer
 * @see <a href="https://celox.io">https://celox.io</a>
 */
public class EditTextDispatched extends Android.support.v7.widget.AppCompatEditText {

    private static final String TAG = "DispatchingEditText";

    private boolean editable = true;

    public EditTextDispatched(Context context) {
        super(context);
    }

    public EditTextDispatched(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditTextDispatched(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    // get the current state
    public boolean isEditable() {
        return editable;
    }

    // set your desired behaviour
    public void setEditable(boolean editable) {
        this.editable = editable;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent motionEvent) {

        if (editable) {
            // default behaviour of an EditText
            super.dispatchTouchEvent(motionEvent);
            return true;
        }

        // achieve the click-behaviour of a TextView (it's cuztom)
        ((RelativeLayout) getParent()).onTouchEvent(motionEvent);
        return true;
    }

}

Référencez la EditTextDispatched dans votre fichier xml (vous devrez modifier le nom du pgk): 

  <io.celox.brutus.EditTextDispatched
    Android:id="@+id/row_field_value"
    style="@style/row_field_text_display"
    Android:layout_alignParentBottom="true"
    Android:text="@string/sample_field_value" />

Invoquer: 

private void changeEditTextBehaviour(EditTextDispatched value, boolean editable) {
    value.setEditable(editable);
    value.setEnabled(editable);
}
0
Martin Pfeffer

Je sais que cette question a déjà reçu une réponse, mais pour donner une réponse plus actuelle (2018), voici la configuration que j'utilise pour obtenir l'effet demandé (c'est-à-dire, sans saisie ni modification):

    val etUserLoc: EditText = themedEditText(R.style.Pale_Blue_Text_Bold_13) {
                id = R.id.et_comp_user_keys_var_user_location
                inputType = InputType.TYPE_NULL
                isClickable = true
                isFocusable = false
                textColor = resources.getColor(R.color.Magenta)  // overrides the default theme color
                text = Editable.Factory.getInstance().newEditable(resources.getString(R.string.loc_swakopmund))
            }.lparams(width = matchConstraint, height = matchParent) {   }

Oui, c’est ANKO puisque je n’utilise plus XML dans aucun de mes projets Android. Le 'inputType' prend en charge la dépréciation 'isEditable'. 

0
SilSur