Jak sprawić, by edytowany tekst nie był edytowalny, ale klikalny w JAVA

91

Czy można EditTextkliknąć, ale nie można go edytować.

Nie chcę, aby było edytowalne (ani klawiatura nie powinna się pojawić, ani nie powinniśmy być w stanie zmienić podpowiedzi)

Właściwie chcę użyć Edytuj tekst po prostu jako obraz z podpowiedzią (której nie można zmienić). Wiem, że rzeczywisty sposób polegał na użyciu ImageViewi jedynki TextView, ale chcę to wypróbować, EditTextponieważ będę wtedy używał tylko jednego widoku zamiast 2. Poza tym wszystko jest dynamiczne, więc nie ma XML.

W przypadku powyższego wymagania rozwiązanie w XML jest, android:editable="false"ale chcę użyć tego w Javie.

Ale,

Jeśli używam: -

et.setEnabled(false);

lub

 et.setKeyListener(null);

Czyni to EditTextnieedytowalnym, ale jednocześnie nieklikalnym.

Aamir Shah
źródło
A co z ustawieniem et.setClickable(true)? To może zadziałać.
Hein
już próbowałem ... ale nie zadziałało ... inne myśli
Aamir Shah
1
może spróbuj użyć układu względnego i umieść pusty prostokąt lub coś NA GÓRZE edytora i wypróbuj klikalną rzecz na prostokącie ..
Wops,

Odpowiedzi:

168

Oto sztuczka: -

et.setFocusable(false);
et.setClickable(true);
Aamir Shah
źródło
5
ale jeśli skopiowałeś jakąś wartość z dowolnego pola, możesz wkleić tę wartość i usłyszeć, naciskając lang, stuknij i wklej .. każdy pomysł, jak usunąć
Rishabh Agrawal
11
@ANinJa możesz ustawić długie klikalne na false, tj. Et.setLongClickable (false);
Luis
Hmm, kursor jest dziwnie podświetlony po kliknięciu / długim kliknięciu ... Ale nie mam lepszego podejścia. : /
Martin Pfeffer
1
Idealny! może być konieczne dodanie et.setLongClickable (false), aby również uniknąć kopiowania / wklejania
thanhbinh84
1
Idealnie, jesteś lekarzem?
Iman Marashi
22

można ustawić EditTextza pomocą kodu java w następujący sposób: -

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

lub używając poniższego kodu w pliku XML dla EditText.

android:editable="false" 
android:inputType="none"  
abhi
źródło
22

Jak editablejest przestarzałe. możesz użyć android:inputTypejako none w projektowaniu xml lub jako InputType.TYPE_NULL w kodowaniu.

Projektowanie 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"/>

Kodowanie

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

A poniżej jest zdarzenie kliknięcia edittext

edt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(YourActivity.this,"edt click", Toast.LENGTH_LONG).show();
    }
});
Nirav Bhavsar
źródło
Zadziałało
8

Możesz użyć tego ...

android:focusableInTouchMode="false"

aby edittext nie był edytowalny w xml, a dla zdarzenia klikalnego możesz użyć zdarzenia setOnTouchListener () , aby zrobić to samo, co ...

editText.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
                        //do your stuff here..
        return false;
    }
});
ridoy
źródło
1
Wygląda na android:focusableInTouchMode="false"to, że jest to wymagane ( android:focusable="false"samo nie działa) w Androidzie O. Przynajmniej w DP2.
xip
7

android:editable jest przestarzały, ale możesz zrobić stg jak poniżej:

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

Użyłem powyższego cade do edycji, w których używam zbieraczy do ustawiania danych. Możesz użyć układu wejściowego z tym.

savepopulation
źródło
7

Edittext włączać i wyłączać dla takiej edycji

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

Poprzez kod java

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

Poprzez xml

<EditText
    android:id="@+id/otp_mpin"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:editable="false"
    android:focusable="false"/>
Kishore Reddy
źródło
0

Dla mnie żadna z odpowiedzi nie zaowocowała w pełni działającym rozwiązaniem.

Prezentacja mojej poprawki https://www.youtube.com/watch?v=oUA4Cuxfdqc

Przewodnik (przyjazny dla noobów) , zwróć uwagę na kilka komentarzy w kodzie.

Utwórz klasę Java dla niestandardowej o EditTextnazwie 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;
    }

}

Odwołaj się do EditTextDispatchedw swoim xml (będziesz musiał zmienić nazwę 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" />

Przywoływać:

private void changeEditTextBehaviour(EditTextDispatched value, boolean editable) {
    value.setEditable(editable);
    value.setEnabled(editable);
}
Martin Pfeffer
źródło
0

Może możesz spróbować

editText.setEnabled(false);
默默 磊 OK
źródło
0

Wiem, że na to pytanie już udzielono odpowiedzi, ale aby udzielić bardziej aktualnej (np. 2018) odpowiedzi, oto konfiguracja, której używam, aby osiągnąć żądany (tj. Niewprowadzany lub edytowalny) efekt:

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

Tak, to jest ANKO, ponieważ nie używam już XML w żadnym z moich projektów Androida. Właściwość „inputType” zajmuje się wycofaniem „isEditable”.

SilSur
źródło
0

Od 2020 r., Jeśli zależy Ci również na dostępności, powinieneś unikać ustawiania et.setFocusable(false); ponieważ spowoduje to, że EdycjaTekstu będzie niedostępna za pomocą nawigacji z klawiatury.

Oto moje rozwiązanie:

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
}
Benny
źródło
-1

możesz także zrobić android:inputMethod="@null"w swoim EditTexti nie pokaże kursora ani klawiatury, a następnie możesz łatwo uchwycić kliknięcie przez ustawienie słuchacza.

SaadurRehman
źródło