Bagaimana cara membuat EditText dengan tombol silang (x) di ujungnya?

198

Apakah ada widget seperti EditTextyang berisi tombol silang, atau apakah ada properti EditTextyang dengannya widget itu dibuat secara otomatis? Saya ingin tombol silang menghapus teks apa pun yang ditulis EditText.

Arun Badole
sumber
2
Tampaknya tidak ada widget standar untuk itu. Tetapi Anda menemukan beberapa pendekatan berbeda dengan pencarian Google untuk "android edittext clear button x". Jadi saya kira "tombol hapus" adalah sebutan mereka. Juga, lihat jawaban ini untuk pertanyaan terkait: stackoverflow.com/questions/4175398/clear-edittext-on-click/…
HostileFork mengatakan jangan percaya SE
Anda dapat mengunduh sumber di sini: github.com/GhOsTTT/editTextXbutton have a nice day
Gökhan Musapaşaoğlu ヅ
pertanyaan lain yang pada dasarnya duplikat adalah mengimplementasikan properti uitextfield di android
Alex Cohn

Jawaban:

166

Gunakan tata letak berikut:

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="9dp"
    android:padding="5dp">

    <EditText
        android:id="@+id/calc_txt_Prise"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"  
        android:layout_marginTop="20dp"
        android:textSize="25dp"
        android:textColor="@color/gray"
        android:textStyle="bold"
        android:hint="@string/calc_txt_Prise"
        android:singleLine="true" />

    <Button
        android:id="@+id/calc_clear_txt_Prise"      
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:layout_gravity="right|center_vertical"
        android:background="@drawable/delete" />

</FrameLayout>

Anda juga dapat menggunakan id tombol dan melakukan tindakan apa pun yang Anda inginkan pada metode onClickListener.

Jaydeep Khamar
sumber
8
ini cara yang tidak efisien untuk melakukannya. Jawaban yanchenko adalah pendekatan yang tepat dalam menggunakan drawable majemuk.
numan salati
4
Jika Anda memilih solusi ini dan memperhatikan bahwa gambar terlalu banyak melebar, Anda mungkin harus menggunakan ImageButton alih-alih Button biasa.
personne3000
3
Meskipun solusi ini "tidak efisien", ini jauh lebih mudah diakses oleh pengguna tunanetra. Menggunakan drawable akan memaksa pengguna Anda untuk melakukan operasi yang sangat rumit untuk menghapus teks - sesuatu yang dapat dilakukan pengguna dengan cepat dengan tombol X.
Daniel Monteiro
2
Apa inefisiensi tentang ini?
Denny
121

Jika Anda kebetulan menggunakan DroidParts , saya baru saja menambahkan ClearableEditText .

Begini tampilannya dengan latar belakang khusus & ikon hapus yang ditetapkan abs__ic_clear_holo_lightdari ActionBarSherlock :

masukkan deskripsi gambar di sini

yanchenko
sumber
11
Solusi terbaik karena kelasnya diperluas EditText. Thx @yanchenko
tbruyelle
2
@stephanek. Saya sudah memperbaiki ini di cabang pengembangan, akan menjadi bagian dari rilis 1.4.3.
yanchenko
4
Terima kasih! Akan sangat keren jika Anda juga bisa menyertakan ClearableAutoCompleteTextView di DroidParts. Untuk pengguna lain yang juga mencoba melakukan ini: gunakan pustaka DroidParts, salin kode dari ClearableEditText dan cukup rentangkan AutoCompleteTextView.
RobinDeCroon
2
Ini bom! Anda juga dapat menggunakannya secara mandiri mengubah ketergantungan TextWatcherAdapter dengan TextWatcher normal.
Pimentoso
1
@yanchenko Lihat implementasi Anda. Sepertinya ada sedikit pertukaran antara area sentuh yang diterima menjadi agak kecil dan memiliki teks edit dengan lebih tinggi dari ketinggian default yang menerima peristiwa sentuh sepanjang sumbu y dalam teks edit. Implementasi Anda adalah yang pertama dan menambang yang terakhir. Dalam situasi yang sama, apakah Anda akan merekomendasikan melakukan hal yang sama? yaitu pergi untuk kotak hit yang lebih kecil yang bisa salah tekan atau memiliki kotak hit yang lebih besar, di mana, dengan teks edit yang meluas atau lebih besar pers bisa berada di luar batas yang bisa digambar.
Jack.Ramsden
64

Solusi 2020 melalui Komponen Desain Material untuk Android:

Tambahkan Komponen Bahan ke pengaturan gradle Anda:

Cari versi terbaru dari sini: https://maven.google.com/

implementation 'com.google.android.material:material:1.1.0'

atau jika Anda belum diperbarui untuk menggunakan lib AndroidX, Anda dapat menambahkannya dengan cara ini:

implementation 'com.android.support:design:28.0.0'

Kemudian

<com.google.android.material.textfield.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/hint_text"
    app:endIconMode="clear_text">

  <com.google.android.material.textfield.TextInputEditText
      android:layout_width="match_parent"
      android:layout_height="wrap_content"/>

</com.google.android.material.textfield.TextInputLayout>

Perhatikan: app: endIconMode = "clear_text"

Seperti yang dibahas di sini, dokumen desain material

kevoroid
sumber
10
Ini harus menjadi jawaban yang baru diterima. Dalam kasus saya, saya tidak dapat menerapkan tanpa memperbarui ke perpustakaan AndroidX.
Ben
@ Ben (acungan jempol)
kevoroid
Pastikan untuk membaca dokumentasi karena tidak semua atribut xml didukung. Anda mungkin harus melihat melalui sumber atau melakukan pesan karena terkadang ada detail implementasi yang tepat. Saya memiliki masalah seperti ini untuk endIcon khusus. Pesan komit mengungkapkan bahwa atribut xml belum memiliki implementasi yang mendukungnya. Harus menggunakan pendekatan yang berbeda hingga implementasi selesai
M. Smith
Jawaban terbaik di tahun 2020.
Sam Chen
apakah aplikasi: endIconMode = "clear_text" berfungsi dengan <androidx.appcompat.widget.AppCompatEditText/>? bisakah Anda membantu saya sama
Arbaz.in
32

Ini adalah solusi kotlin. Masukkan metode pembantu ini di beberapa file kotlin

fun EditText.setupClearButtonWithAction() {

    addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
            val clearIcon = if (editable?.isNotEmpty() == true) R.drawable.ic_clear else 0
            setCompoundDrawablesWithIntrinsicBounds(0, 0, clearIcon, 0)
        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) = Unit
    })

    setOnTouchListener(View.OnTouchListener { _, event ->
        if (event.action == MotionEvent.ACTION_UP) {
            if (event.rawX >= (this.right - this.compoundPaddingRight)) {
                this.setText("")
                return@OnTouchListener true
            }
        }
        return@OnTouchListener false
    })
}

Dan kemudian menggunakannya sebagai berikut dalam onCreatemetode dan Anda harus baik untuk pergi

yourEditText.setupClearButtonWithAction()

BTW, Anda harus menambahkan R.drawable.ic_clearatau menghapus ikon pada awalnya. Yang ini dari google- https://material.io/tools/icons/?icon=clear&style=baseline

Gulshan
sumber
Jika Anda memasukkan this.clearFocus()sebelum mengembalikan pernyataan benar, Anda dapat mendengarkan acara ini di pemanggil EditText dengan onFocusChangependengar
Joost Schepel
Hebat itu wotking, satu-satunya masalah adalah saya mengatur ikon kiri yang dapat ditarik di AppCompatEditText dan itu akan dihapus ketika saya memanggil funcion ini dapatkah Anda memberi tahu saya apa masalahnya?
Arbaz.in
@ Arbaz.in Ini karena metode panggilan setCompoundDrawablesWithIntrinsicBounds(0, 0, clearIcon, 0). Anda dapat melewatkan id ikon yang dapat ditarik kiri sebagai param baru untuk fungsi ini dan memasukkannya ke dalam panggilan.
Gulshan
@ Gulshan saya telah melakukan yang sama masih menghapus yang dapat ditarik
Arbaz.in
20

Dukungan libarary Android memiliki SearchViewkelas yang melakukan hal ini. (Tidak diturunkan dari EditTextjadi, jadi harus menggunakan SearchView.OnQueryTextListenerbukan a TextWatcher)

Cari tampilan tanpa teks (dan teks petunjuk "Cari")

masukkan deskripsi gambar di sini

Gunakan dalam XML seperti:

  <android.support.v7.widget.SearchView
            android:id="@+id/searchView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:iconifiedByDefault="false"
            android:queryHint="@string/SearchHint"
            app:iconifiedByDefault="false"
            app:queryHint="@string/SearchHint" />
Diederik
sumber
16
Drawable x = getResources().getDrawable(R.drawable.x);
x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());
mEditText.setCompoundDrawables(null, null, x, null);

dimana, x adalah:

masukkan deskripsi gambar di sini

Eamorr
sumber
8
Masih kita perlu menetapkan hak onClickListener? Pencarian cepat memberi saya ini . Tebak solusi yang lebih baik adalah menggunakan Framelayout. Terimakasih Meskipun!
VenoM
6

Jika Anda tidak ingin menggunakan tampilan khusus atau tata letak khusus, Anda dapat menggunakan 9-patch untuk membuat tombol (X).

Contoh: http://postimg.org/image/tssjmt97p/ (Saya tidak punya cukup poin untuk memposting gambar di StackOverflow)

Perpotongan piksel hitam kanan dan bawah mewakili area konten. Apa pun di luar area itu adalah padding. Jadi untuk mendeteksi bahwa pengguna mengklik x Anda dapat mengatur OnTouchListener seperti:

editText.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_UP){
                    if (motionEvent.getX()>(view.getWidth()-view.getPaddingRight())){
                        ((EditText)view).setText("");
                    }
                }
                return false;
            }
        });

Sesuai dengan kebutuhan Anda, solusi ini dapat bekerja lebih baik dalam beberapa kasus. Saya lebih suka menjaga agar xml saya tidak terlalu rumit. Ini juga membantu jika Anda ingin memiliki ikon di sebelah kiri, karena Anda cukup memasukkannya di patch 9.

Andrei Tudor Diaconu
sumber
4

Saya melakukan bagian UI seperti di bawah ini:

<RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:layout_marginTop="9dp"
            android:padding="5dp">

            <EditText
                android:id="@+id/etSearchToolbar"
                android:layout_width="fill_parent"
                android:layout_height="match_parent"
                android:textSize="13dp"
                android:padding="10dp"
                android:textColor="@android:color/darker_gray"
                android:textStyle="normal"
                android:hint="Search"
                android:imeOptions="actionSearch"
                android:inputType="text"
                android:background="@drawable/edittext_bg"
                android:maxLines="1" />

            <ImageView
                android:id="@+id/ivClearSearchText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginRight="6dp"
                android:src="@drawable/balloon_overlay_close"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true" />


        </RelativeLayout>

edittext_bg.xml

<?xml version="1.0" encoding="utf-8"?>

<solid android:color="#FFFFFF" />

<stroke
    android:width="1dp"
    android:color="#C9C9CE" />

<corners
    android:bottomLeftRadius="15dp"
    android:bottomRightRadius="15dp"
    android:topLeftRadius="15dp"
    android:topRightRadius="15dp" />

balloon_overlay_close.pngmasukkan deskripsi gambar di sini

Tombol Silang / Hapus sembunyikan / tampilkan:

searchBox.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            if(charSequence.length() > 0){
                clearSearch.setVisibility(View.VISIBLE);
            }else{
                clearSearch.setVisibility(View.GONE);
            }
        }

        @Override
        public void afterTextChanged(Editable editable) {}
    });

Menangani barang pencarian (yaitu ketika pengguna mengklik pencarian dari papan tombol lunak)

searchBox.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                String contents = searchBox.getText().toString().trim();
                if(contents.length() > 0){
                    //do search

                }else
                    //if something to do for empty edittext

                return true;
            }
            return false;
        }
    });`

Tombol hapus / silang

  clearSearch.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            searchBox.setText("");
        }
    });
Ranjit
sumber
2

Menggunakan

android:drawableRight="@android:drawable/ic_input_delete"
HimalayanCoder
sumber
2

Ini perpustakaan lengkap dengan widget: https://github.com/opprime/EditTextField

Untuk menggunakannya Anda harus menambahkan ketergantungan:

compile 'com.optimus:editTextField:0.2.0'

Di file layout.xml Anda dapat bermain dengan pengaturan widget:

xmlns:app="http://schemas.android.com/apk/res-auto"
  • app: clearButtonMode , dapat memiliki nilai seperti itu: tidak pernah selalu sementara Mengedit kecuali Mengedit

  • app: clearButtonDrawable

Contoh dalam aksi:

masukkan deskripsi gambar di sini

Kirill Vashilo
sumber
2

Cukup beri tanda silang seperti drawableEndpada Anda EditText:

<EditText
     ...
    android:drawableEnd="@drawable/ic_close"
    android:drawablePadding="8dp"
     ... />

dan gunakan ekstensi untuk menangani klik (atau gunakan OnTouchListenerlangsung pada Anda EditText):

fun EditText.onDrawableEndClick(action: () -> Unit) {
    setOnTouchListener { v, event ->
        if (event.action == MotionEvent.ACTION_UP) {
            v as EditText
            val end = if (v.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL)
                v.left else v.right
            if (event.rawX >= (end - v.compoundPaddingEnd)) {
                action.invoke()
                return@setOnTouchListener true
            }
        }
        return@setOnTouchListener false
    }
}

penggunaan ekstensi:

editText.onDrawableEndClick {
    // TODO clear action
    etSearch.setText("")
}
Francis
sumber
1

Anda dapat menggunakan potongan ini dengan jawaban Jaydip untuk lebih dari satu tombol. panggil saja setelah mendapatkan referensi ke ET dan Tombol Elemen. Saya menggunakan tombol vecotr sehingga Anda harus mengubah elemen Button menjadi ImageButton:

private void setRemovableET(final EditText et, final ImageButton resetIB) {

        et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus && et.getText().toString().length() > 0)
                    resetIB.setVisibility(View.VISIBLE);
                else
                    resetIB.setVisibility(View.INVISIBLE);
            }
        });

        resetIB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                et.setText("");
                resetIB.setVisibility(View.INVISIBLE);
            }
        });

        et.addTextChangedListener(new TextWatcher() {
            @Override
            public void afterTextChanged(Editable s) {}
            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {
            }
            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
                if(s.length() != 0){
                    resetIB.setVisibility(View.VISIBLE);
                }else{
                    resetIB.setVisibility(View.INVISIBLE);
                }
            }
        });
    }
sivi
sumber
0

Jika Anda berada di tata letak bingkai atau Anda dapat membuat tata letak bingkai saya mencoba pendekatan lain ....

<TextView
    android:id="@+id/inputSearch"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableRight="@drawable/ic_actionbar"
    android:layout_alignParentBottom="true"
    android:layout_toRightOf="@+id/back_button"/>

<Button
    android:id="@+id/clear_text_invisible_button"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_gravity="right|center_vertical"
    android:background="@color/transparent"
    android:layout_alignBaseline="@+id/inputSearch"
    android:layout_alignBottom="@+id/inputSearch"
    android:layout_alignRight="@+id/inputSearch"
    android:layout_alignEnd="@+id/inputSearch"
    android:layout_marginRight="13dp"
    />

Ini adalah teks edit di mana saya meletakkan ikon silang sebagai gambar yang benar dan daripada itu, saya meletakkan tombol transparan yang menghapus teks.

Kleand Sherali
sumber
0
    <EditText
    android:id="@+id/idSearchEditText"
    android:layout_width="match_parent"
    android:layout_height="@dimen/dimen_40dp"
    android:drawableStart="@android:drawable/ic_menu_search"
    android:drawablePadding="8dp"
    android:ellipsize="start"
    android:gravity="center_vertical"
    android:hint="Search"
    android:imeOptions="actionSearch"
    android:inputType="text"
    android:paddingStart="16dp"
    android:paddingEnd="8dp"
/>

EditText mSearchEditText = findViewById(R.id.idSearchEditText);
mSearchEditText.addTextChangedListener(this);
mSearchEditText.setOnTouchListener(this);


@Override
public void afterTextChanged(Editable aEditable) {
    int clearIcon = android.R.drawable.ic_notification_clear_all;
    int searchIcon = android.R.drawable.ic_menu_search;
    if (aEditable == null || TextUtils.isEmpty(aEditable.toString())) {
        clearIcon = 0;
        searchIcon = android.R.drawable.ic_menu_search;
    } else {
        clearIcon = android.R.drawable.ic_notification_clear_all;
        searchIcon = 0;
    }
    Drawable leftDrawable =  null;
    if (searchIcon != 0) {
        leftDrawable = getResources().getDrawable(searchIcon);
    }
    Drawable rightDrawable = null;
    if (clearIcon != 0) {
        rightDrawable = getResources().getDrawable(clearIcon);
    }

    mSearchEditText.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, rightDrawable, null);
}


@Override
public boolean onTouch(View aView, MotionEvent aEvent) {
    if (aEvent.getAction() == MotionEvent.ACTION_UP){
        if (aEvent.getX() > ( mSearchEditText.getWidth() - 
         mSearchEditText.getCompoundPaddingEnd())){
            mSearchEditText.setText("");
        }
    }
    return false;
}
Anupam Singh
sumber