Sonunda çapraz (x) düğmeli EditText nasıl oluşturulur?


198

EditTextÇapraz düğme içeren herhangi bir widget var mı veya EditTextotomatik olarak oluşturulduğu herhangi bir özellik var mı? Çapraz düğmenin yazılan metni silmesini istiyorum EditText.


2
Bunun için herhangi bir standart widget gibi görünmüyor. Ancak "android edittext clear button x" için bir Google aramasıyla birkaç farklı yaklaşım bulursunuz. Yani "açık düğmeler" dedikleri şey bu. Ayrıca, ilgili bir sorunun bu cevabına bakınız: stackoverflow.com/questions/4175398/clear-edittext-on-click/…
HostileFork, SE

Buradan kaynak indirebilirsiniz: github.com/GhOsTTT/editTextXbutton iyi günler
Gökhan Musapaşaoğlu ヅ

Yanıtlar:


166

Aşağıdaki düzeni kullanın:

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

Ayrıca, düğmenin kimliğini kullanabilir ve onClickListener yönteminde istediğiniz işlemi yapabilirsiniz.


8
bu yapmanın verimsiz bir yoludur. yanşenko'nun cevabı bileşik çekmeceleri kullanmanın doğru yaklaşımıdır.
numan salati

4
Bu çözümü seçerseniz ve görüntünün çok fazla uzatıldığını fark ederseniz, muhtemelen normal bir Düğme yerine bir ImageButton kullanmalısınız.
personne3000

3
Bu çözüm "verimsiz" olsa da, kör kullanıcılar için çok daha erişilebilir. Çekilebilir kullanmak, kullanıcılarınızı metni temizlemek için çok karmaşık işlemler yapmaya zorlar - bu, kullanıcıların X düğmesiyle hızlı bir şekilde yapabileceği bir şeydir.
Daniel Monteiro

2
Bunun verimsizliği nedir?
Denny

121

Eğer kullanım edersek DroidParts , sadece ekledik ClearableEditText .

Burada özel bir arka plana & açık simge seti ile şu şekilde görünür abs__ic_clear_holo_lightgelen ActionBarSherlock :

resim açıklamasını buraya girin


11
Sınıf genişlediğinden en iyi çözüm EditText. Thx @yanchenko
tbruyelle

2
@stephanek. Bunu geliştirme dalında çözdüm, 1.4.3 sürümünün bir parçası olacak.
yanchenko

4
Teşekkürler! DroidParts'a bir ClearableAutoCompleteTextView da ekleyebilirseniz gerçekten harika olurdu. Bunu yapmaya çalışan diğer kullanıcılar için: DroidParts kitaplığını kullanın, kodu ClearableEditText'ten kopyalayın ve AutoCompleteTextView öğesini genişletin.
RobinDeCroon

2
Bu bomba! Ayrıca, TextWatcherAdapter bağımlılığını normal bir TextWatcher ile değiştirmek için bağımsız olarak da kullanabilirsiniz.
Pimentoso

1
@yanchenko Uygulamanıza bir göz atın. Kabul edilen dokunma alanının oldukça küçük olması ve düzenleme metnindeki y ekseni boyunca dokunma olaylarını kabul eden varsayılan yükseklikten daha büyük bir düzenleme metnine sahip olması arasında bir miktar alım satım var gibi görünüyor. Uygulamanız birinciydi ve ikincisiydi. Benzer durumlarda, aynı şeyi yapmanızı tavsiye eder misiniz? yani, genişletilmiş veya daha büyük bir düzenleme metni ile preslerin çekilebilir sınırların çok dışında olabileceği, yanlış basılabilen veya daha büyük bir vuruş kutusuna sahip olan daha küçük bir vuruş kutusu için gidin.
Jack Ramsden

67

Android için Material Design Components ile 2020 çözümü:

Gradle kurulumunuza Malzeme Bileşenleri ekleyin:

En son sürümü buradan arayın: https://maven.google.com/

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

ya da AndroidX kütüphanelerini kullanarak güncellenmemişse, şu şekilde ekleyebilirsiniz:

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

Sonra

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

Dikkat: app: endIconMode = "clear_text"

Burada tartışıldığı gibi Materyal tasarım dokümanları


10
Bu kabul edilen yeni cevap olmalı. Benim durumumda, AndroidX kütüphanelerine güncelleme yapmadan uygulayamadım.
Ben

@Ben (yaşasın)
kevoroid

Tüm xml öznitelikleri henüz desteklenmediğinden lütfen belgeleri okuduğunuzdan emin olun. Kaynak veya işlem iletilerine bazen kesin uygulama ayrıntılarının olduğu yerlerde bakmanız gerekebilir. Özel bir endIcon için bu tür bir sorun vardı. Bir taahhüt iletisi, xml özelliğinin henüz onu destekleyen bir uygulaması olmadığını ortaya koydu. Uygulama bitene kadar farklı bir yaklaşım kullanmak zorunda kalacak
M. Smith

2020'de en iyi cevap.
Sam Chen

app: endIconMode = "clear_text" ile çalışıyor <androidx.appcompat.widget.AppCompatEditText/>mu? bana aynı şekilde yardım edebilir misiniz
Arbaz.in

32

Bu bir kotlin çözümüdür. Bu yardımcı yöntemi bazı kotlin dosyalarına koyun.

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

Ve sonra onCreateyöntemi aşağıdaki gibi kullanın ve gitmek için iyi olmalısınız-

yourEditText.setupClearButtonWithAction()

BTW, R.drawable.ic_clearilk önce eklemek veya net bir simge eklemeniz gerekir . Bu, google- https://material.io/tools/icons/?icon=clear&style=baseline adresinden


this.clearFocus()Return true ifadesinden önce eklerseniz , bu olayı EditText arayanında onFocusChangedinleyici ile dinleyebilirsiniz
Joost Schepel

Harika bu wotking, sadece sorun ben AppCompatEditText içinde çekilebilir sol simge ayarlamak ve ben bu fonksiyonu çağırdığınızda kaldıracak lütfen bana ne sorunu söyleyebilir misiniz?
Arbaz.in

@ Arbaz.in Çünkü çağrı yöntemi setCompoundDrawablesWithIntrinsicBounds(0, 0, clearIcon, 0). Sol çekilebilir simge kimliğini bu işleve yeni bir parametre olarak iletebilir ve çağrıya koyabilirsiniz.
Gulshan

@ Gülşen i hala aynı çekilebilir kaldırmak yaptık
Arbaz.in

20

Android'in destek kütüphanesi SearchViewtam olarak bunu yapan bir sınıfa sahiptir. ( EditTextGerçi değil , bu yüzden bir SearchView.OnQueryTextListeneryerine kullanmak zorunda TextWatcher)

Metin içermeyen arama görünümü (ve ipucu metni "Ara")

resim açıklamasını buraya girin

XML'de şu şekilde kullanın:

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

16
Drawable x = getResources().getDrawable(R.drawable.x);
x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());
mEditText.setCompoundDrawables(null, null, x, null);

burada, x:

resim açıklamasını buraya girin


8
Yine de bir onClickListener atamalıyız değil mi? Hızlı bir arama bana bunu verdi . Sanırım daha iyi bir çözüm Framelayout ile gitmek. Yine de teşekkürler!
Mart'ta VenoM


6

Özel görünümler veya özel düzenler kullanmak istemiyorsanız, (X) düğmesini yapmak için 9 yamayı kullanabilirsiniz.

Örnek: http://postimg.org/image/tssjmt97p/ (StackOverflow'da resim yayınlamak için yeterli puanım yok)

Sağ ve alt siyah piksellerin kesişimi içerik alanını temsil eder. Bu alanın dışındaki her şey dolgu. Kullanıcının x'i tıkladığını tespit etmek için şöyle bir OnTouchListener ayarlayabilirsiniz:

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

İhtiyaçlarınıza göre bu çözüm bazı durumlarda daha iyi çalışabilir. Ben benim xml daha az karmaşık tutmayı tercih ederim. Bu, solda bir simge olmasını istiyorsanız da yardımcı olur, çünkü sadece 9 yamaya dahil edebilirsiniz.


4

UI bölümünü aşağıdaki gibi yaptım:

<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.pngresim açıklamasını buraya girin

Çapraz / Temizle düğmesi gizle / göster:

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

Arama öğelerini işleme (ör. Kullanıcı yazılım klavyesinden aramayı tıkladığında)

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;
        }
    });`

Sil / Çapraz düğmesi

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


2

Widget ile birlikte tam kütüphane: https://github.com/opprime/EditTextField

Bunu kullanmak için bağımlılığı eklemelisiniz:

compile 'com.optimus:editTextField:0.2.0'

Layout.xml dosyasında widget ayarlarıyla oynayabilirsiniz:

xmlns:app="http://schemas.android.com/apk/res-auto"
  • app: clearButtonMode , böyle değerlere sahip olabilir: asla her zaman whileDüzenleme

  • app: clearButtonDrawable

Uygulamadaki örnek:

resim açıklamasını buraya girin


2

Sadece drawableEndsenin gibi yakın çapraz koymak EditText:

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

ve kullanım uzatma kolu tıklaması (veya kullanım OnTouchListenerdoğrudan sizinle ilgili şu 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
    }
}

uzatma kullanımı:

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

1

Bu snippet'i birden fazla düğme için Jaydip yanıtıyla kullanabilirsiniz. ET ve Düğme Elemanlarına referans aldıktan sonra onu arayın. Button öğesini ImageButton olarak değiştirmek zorunda olduğunuz için vecotr düğmesini kullandım:

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

0

Çerçeve düzenindeyseniz veya çerçeve düzeni oluşturabiliyorsanız başka bir yaklaşım denedim ....

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

Bu, bir çapraz simgeyi sağ çizilebilir olarak koyduğum bir düzenleme metnidir ve ÜSTÜNDEN metni temizleyen şeffaf bir düğme koydum.


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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.