Bagaimana membuat teks edit tidak dapat diedit tetapi dapat diklik di JAWA


91

Apakah mungkin membuat EditTextdapat diklik tetapi tidak dapat diedit.

Saya tidak ingin itu dapat diedit (Keyboard harus muncul atau kami tidak dapat mengubah petunjuknya)

Sebenarnya saya ingin menggunakan Edit teks hanya sebagai gambar dengan petunjuk (yang tidak dapat diubah). Saya tahu cara sebenarnya adalah menggunakan satu ImageViewdan satu TextView, tetapi saya ingin mencobanya EditTextkarena saya akan menggunakan hanya satu tampilan, bukan 2. Juga semuanya dinamis jadi tidak ada XML.

Untuk persyaratan di atas, solusi dalam XML adalah android:editable="false"tetapi saya ingin menggunakan ini di Java.

Tapi,

Jika saya menggunakan: -

et.setEnabled(false);

atau

 et.setKeyListener(null);

Itu membuat EditTexttidak DAPAT DIEDIT tetapi pada saat yang sama juga membuatnya tidak dapat diklik.


Bagaimana dengan pengaturan et.setClickable(true)? Mungkin berhasil.
Hein

sudah mencoba .... tetapi tidak berhasil ... pikiran lain
Aamir Shah

1
mungkin mencoba menggunakan tata letak relatif dan meletakkan persegi panjang kosong atau sesuatu DI ATAS teks editan, dan mencoba hal yang dapat diklik pada persegi ..
Wops

Jawaban:


168

Triknya di sini adalah: -

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

5
tetapi jika Anda telah menyalin beberapa nilai dari bidang mana pun, Anda dapat menempelkan nilai itu dengan menekan lang tap dan tempel .. ada ide cara menghapus
Rishabh Agrawal

11
@ANinJa Anda dapat menyetel long clickable menjadi false, yaitu et.setLongClickable (false);
Luis

Hmm, kursor disorot dengan cara yang aneh pada click / longclick ... Tapi saya tidak memiliki pendekatan yang lebih baik. : /
Martin Pfeffer

1
Sempurna! Anda mungkin perlu menambahkan et.setLongClickable (false) untuk menghindari salin / tempel juga
thanhbinh84

1
Sempurna, Apakah Anda Dokter?
Iman Marashi

22

Anda dapat mengatur EditTextdengan menggunakan kode java sebagai berikut: -

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

atau dengan menggunakan kode di bawah ini dalam file XML untuk EditText.

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

22

Seperti yang editablesudah usang. Anda dapat menggunakan android:inputTypesebagai tidak ada dalam mendesain xml atau sebagai InputType.TYPE_NULL dalam pengkodean.

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

Pengodean

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

Dan di bawah ini adalah acara klik edittext

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

Bekerja seperti pesona bagi saya
Karim Bibars

8

Anda bisa menggunakan ini ..

android:focusableInTouchMode="false"

untuk membuat edittext tidak dapat diedit dalam xml. Dan untuk acara yang dapat diklik Anda dapat menggunakan acara setOnTouchListener () untuk melakukan hal yang sama seperti ..

editText.setOnTouchListener(new OnTouchListener() {

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

1
Sepertinya android:focusableInTouchMode="false"juga diperlukan ( android:focusable="false"saja tidak berfungsi) di Android O. Setidaknya, di DP2.
xip

7

android:editable sudah usang tetapi Anda dapat melakukan stg seperti di bawah ini:

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

Saya menggunakan cade di atas untuk edittexts yang saya gunakan pemetik untuk mengatur data masuk Anda dapat menggunakan tata letak input dengan ini.


7

Edittext aktifkan dan nonaktifkan untuk pengeditan seperti ini

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

Melalui kode java

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

Melalui xml

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

0

Bagi saya, tidak ada jawaban yang menghasilkan solusi yang benar-benar berfungsi.

Pamerkan perbaikan saya https://www.youtube.com/watch?v=oUA4Cuxfdqc

Panduan (ramah noob) , harap perhatikan beberapa komentar di kode.

Buat kelas Java untuk kustom yang EditTextdisebut 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;
    }

}

Referensi EditTextDispatcheddalam xml Anda (Anda harus mengubah nama 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" />

Untuk meminta:

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


0

Saya tahu pertanyaan ini telah dijawab tetapi untuk memberikan jawaban yang lebih terkini (yaitu 2018) di sini adalah pengaturan yang saya gunakan untuk mencapai efek yang diminta (yaitu non-input atau diedit):

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

Ya, ini ANKO karena saya tidak lagi menggunakan XML di Proyek Android saya. 'InputType' menangani penghentian 'isEditable'.


0

Pada tahun 2020, jika Anda juga peduli dengan aksesibilitas, Anda harus menghindari pengaturan et.setFocusable(false);karena itu akan membuat EditText tidak dapat dijangkau menggunakan navigasi Keyboard.

Inilah solusi saya:

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

Anda juga dapat melakukannya android:inputMethod="@null"di Anda EditTextdan itu tidak akan menampilkan kursor atau keyboard dan kemudian Anda dapat dengan mudah memahami pendengar klik melalui pengaturan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.