Come rendere la modifica del testo non modificabile ma cliccabile in JAVA


93

È possibile rendere EditTextcliccabili ma non modificabili.

Non voglio che sia modificabile (né la tastiera dovrebbe alzarsi né dovremmo essere in grado di cambiare il suggerimento)

In realtà voglio usare Modifica testo semplicemente come un'immagine con un suggerimento (che non può essere modificato). So che il modo effettivo era usare ImageViewe uno TextView, ma voglio che provi EditTextperché userò solo una vista invece di 2. Inoltre ogni cosa è dinamica, quindi niente XML.

Per il requisito di cui sopra la soluzione in XML è android:editable="false"ma voglio usarla in Java.

Ma,

Se uso: -

et.setEnabled(false);

o

 et.setKeyListener(null);

Rende il EditTextnon EDITABILE ma allo stesso tempo lo rende anche non cliccabile.


Che ne dici di ambientazione et.setClickable(true)? Potrebbe funzionare.
Hein

già provato ... ma non ha funzionato ... altri pensieri
Aamir Shah

1
magari prova a usare il layout relativo e metti un rettangolo vuoto o qualcosa SOPRA il testo modificato, e prova la cosa cliccabile sul rettangolo ..
Wops

Risposte:


171

Il trucco qui è: -

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

5
ma se avessi copiato un valore da qualsiasi campo, puoi incollare quel valore, ascoltalo premendo lang, tocca e incolla .. qualsiasi idea su come rimuovere
Rishabh Agrawal

11
@ANinJa puoi impostare il long clickable su false, cioè et.setLongClickable (false);
Luis

Hmm, il cursore è evidenziato in un modo strano su click / longclick ... Ma non ho un approccio migliore. : /
Martin Pfeffer

1
Perfetto! potresti dover aggiungere et.setLongClickable (false) per evitare anche di copiare / incollare
thanhbinh84

1
Perfetto, sei dottore?
Iman Marashi

23

Come editableè deprecato. puoi usare android:inputTypecome nessuno nella progettazione di xml o come InputType.TYPE_NULL nella codifica.

Progettazione di 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"/>

Codifica

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

E di seguito è riportato l'evento clic di edittext

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

22

puoi impostare EditTextusando il codice java come segue: -

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

o utilizzando il codice seguente nel file XML per EditText.

android:editable="false" 
android:inputType="none"  

9

Puoi usare questo ..

android:focusableInTouchMode="false"

per rendere edittext non modificabile in xml. e per l'evento cliccabile puoi usare l' evento setOnTouchListener () per fare la stessa cosa di come ..

editText.setOnTouchListener(new OnTouchListener() {

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

1
Sembra che android:focusableInTouchMode="false"sia richiesto ( android:focusable="false"da solo non funziona) in Android O. Almeno, in DP2.
xip

7

android:editable è deprecato ma puoi eseguire stg come di seguito:

android:editable="false"
android:focusable="false"
android:focusableInTouchMode="false"

Ho usato il cade sopra per i testi editoriali in cui uso i selettori per impostare i dati. Puoi usare il layout di input con questo.


7

Edittext abilitare e disabilitare per la modifica in questo modo

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

Tramite codice java

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

Tramite xml

<EditText
    android:id="@+id/otp_mpin"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:editable="false"
    android:focusable="false"/>

0

Per me nessuna delle risposte ha portato a una soluzione completamente funzionante.

Vetrina della mia correzione https://www.youtube.com/watch?v=oUA4Cuxfdqc

Guida (noob-friendly) , si prega di notare i pochi commenti nel codice.

Crea una classe Java per un custom EditTextchiamato 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;
    }

}

EditTextDispatchedFai riferimento a nel tuo xml (dovrai modificare il nome-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" />

Invocare:

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


0

So che a questa domanda è già stata data una risposta, ma per dare una risposta più attuale (cioè 2018) ecco la configurazione che utilizzo per ottenere l'effetto richiesto (cioè non input o modificabile):

    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) {   }

Sì, questo è ANKO poiché non uso più XML in nessuno dei miei progetti Android. "InputType" si occupa della deprecazione "isEditable".


0

A partire dal 2020, se ti interessa anche l'accessibilità, dovresti evitare l'impostazione et.setFocusable(false);poiché ciò renderà EditText non raggiungibile utilizzando la navigazione da tastiera.

Ecco la mia soluzione:

Kotlin

editText.isFocusableInTouchMode = false

editText.isLongClickable = false //this will prevent copy and paste

editText.setOnClickListener {
   // handle the click
   // this will automatically make the edittext clickable = true
}

-1

puoi anche farlo android:inputMethod="@null"nel tuo EditTexte non mostrerà il cursore o la tastiera e quindi puoi facilmente afferrare il clic attraverso l'impostazione dell'ascoltatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.