So machen Sie den Bearbeitungstext in JAVA nicht bearbeitbar, aber anklickbar

89

Ist es möglich, EditTextklickbar, aber nicht bearbeitbar zu machen ?

Ich möchte nicht, dass es bearbeitet werden kann (Weder sollte die Tastatur hochfahren, noch sollten wir den Hinweis ändern können).

Eigentlich möchte ich Text bearbeiten einfach als Bild mit einem Hinweis verwenden (der nicht geändert werden kann). Ich weiß, dass der eigentliche Weg darin bestand, ein ImageViewund eins zu verwenden TextView, aber ich möchte, dass es versucht wird, EditTextda ich dann nur eine Ansicht anstelle von 2 verwende. Außerdem ist alles dynamisch, also kein XML.

Für die oben genannte Anforderung ist die Lösung in XML, android:editable="false"aber ich möchte dies in Java verwenden.

Aber,

Wenn ich benutze: -

et.setEnabled(false);

oder

 et.setKeyListener(null);

Es macht das EditTextnicht BEARBEITBAR, aber gleichzeitig macht es es auch nicht anklickbar.

Aamir Shah
quelle
Wie wäre es mit Einstellung et.setClickable(true)? Es könnte klappen.
Hein
bereits versucht .... aber nicht funktioniert ... keine anderen Gedanken
Aamir Shah
1
Vielleicht versuchen Sie, ein relatives Layout zu verwenden und ein leeres Rechteck oder etwas oben auf den Edittext zu setzen, und versuchen Sie das anklickbare Ding auf der rechten Seite.
Wops

Antworten:

163

Der Trick hier ist: -

et.setFocusable(false);
et.setClickable(true);
Aamir Shah
quelle
4
Aber wenn Sie einen Wert aus einem beliebigen Feld kopiert haben, können Sie diesen Wert einfügen, indem Sie auf lang tippen und einfügen. Jede Idee zum Entfernen
Rishabh Agrawal
9
@ANinJa Sie können das lange Klicken auf false setzen, dh et.setLongClickable (false);
Luis
Hmm, der Cursor wird beim Klicken / Longclick auf seltsame Weise hervorgehoben ... Aber ich habe keinen besseren Ansatz. : /
Martin Pfeffer
1
Perfekt! Möglicherweise müssen Sie et.setLongClickable (false) hinzufügen, um auch das Kopieren / Einfügen zu vermeiden
thanhbinh84
1
Perfekt, bist du Doktor?
Iman Marashi
22

Sie können EditTextmithilfe von Java-Code Folgendes festlegen: -

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

oder indem Sie den folgenden Code in der XML-Datei für verwenden EditText.

android:editable="false" 
android:inputType="none"  
abhi
quelle
20

Da editableist veraltet. Sie können beim Entwerfen von XML android:inputTypeals keine oder beim Codieren als InputType.TYPE_NULL verwenden.

XML entwerfen

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

Codierung

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

Und unten ist das Klickereignis von edittext

edt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(YourActivity.this,"edt click", Toast.LENGTH_LONG).show();
    }
});
Nirav Bhavsar
quelle
Arbeitete wie ein Zauber für mich
Karim Bibars
8

Sie können dies verwenden ..

android:focusableInTouchMode="false"

Um edittext in xml nicht bearbeitbar zu machen. Und für ein anklickbares Ereignis können Sie das setOnTouchListener () -Ereignis verwenden , um dasselbe zu tun wie ..

editText.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
                        //do your stuff here..
        return false;
    }
});
Ridoy
quelle
1
Sieht so aus, als wäre android:focusableInTouchMode="false"es auch android:focusable="false"in Android O erforderlich ( allein funktioniert nicht). Zumindest in DP2.
xip
7

android:editable ist veraltet, aber Sie können stg wie folgt tun:

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

Ich habe die obige Cade für Edittexte verwendet, in denen ich Picker zum Einstellen von Daten verwende. Sie können damit das Eingabelayout verwenden.

Savepopulation
quelle
6

Edittext Aktivieren und deaktivieren Sie diese Option für die Bearbeitung

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

Durch Java-Code

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

Durch 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
quelle
0

Für mich führte keine der Antworten zu einer vollständig funktionierenden Lösung.

Schaufenster meines Fixes https://www.youtube.com/watch?v=oUA4Cuxfdqc

Leitfaden (noob-freundlich) , bitte beachten Sie die wenigen Kommentare im Code.

Erstellen Sie eine Java-Klasse für eine benutzerdefinierte Klasse EditTextnamens 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;
    }

}

Verweisen Sie auf die EditTextDispatchedin Ihrer XML (Sie müssen den pgk-Namen ändern):

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

So rufen Sie auf:

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

Vielleicht kannst du es versuchen

editText.setEnabled(false);
默默 磊 OK
quelle
0

Ich weiß, dass diese Frage bereits beantwortet wurde, aber um eine aktuellere Antwort (dh 2018) zu geben, verwende ich das Setup, um den angeforderten (dh nicht eingegebenen oder bearbeitbaren) Effekt zu erzielen:

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

Ja, dies ist ANKO, da ich in keinem meiner Android-Projekte mehr XML verwende. Der 'inputType' kümmert sich um die 'isEditable'-Abwertung.

SilSur
quelle
0

Wenn Sie sich ab 2020 auch um die Barrierefreiheit kümmern, sollten Sie die Einstellung vermeiden, et.setFocusable(false);da dadurch der EditText nicht über die Tastaturnavigation erreichbar ist.

Hier ist meine Lösung:

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
quelle
-1

Sie können dies auch android:inputMethod="@null"in Ihrem tun EditTextund es wird weder der Cursor noch die Tastatur angezeigt, und dann können Sie den Klick durch das Einstellen des Listeners leicht erfassen.

SaadurRehman
quelle