自定义EditText的使用(一键删除)|ListView item中多edittext问题

android 获取ListView的Item中多个Edittext的输入值 文章开始之前,请大家思考这样一个问题 ListView的每条Item中多个Edittext如何获取输入值?且防止数据错乱? 如果是你你会怎么做?如果你有更好的思路欢迎你留言,谢谢 先给老铁们上一张动态图 这里我偷了一个懒,直接使用的是我的Android中ListView结合CheckBox获取选中项 博客中的源代码来实现的 可以看到我们的动态图上,单选,全选,局部修改... 阅读详情

在实际开发的时候,应用的登录界面和注册界面通常会用到这个,我说的就是EditText末尾处的那个叉号,当输入EditText中的内容不符合自己的意愿,想全部删除的时候,可以点击那个叉号实现一键删除EditText里面的全部内容。效果图如下:

这里写图片描述

当然,EditText里的内容为null的时候,这个叉号是不能显示的,只有输入内容才允许显示。
有些人会有疑问,包括我一开始的时候也是,为啥要用自定义?直接在xml里设置图片资源,先隐藏,再判断当EditText不为null的时候再将叉号显示出来,不也能实现这样的效果?
答案是:确实也能实现效果,但是没有考虑到复用性。你想想,一个应用的登录界面和注册界面可能会有很多EditText,然后每一个EditText你都需要在xml设置好图片资源先隐藏,然后再判断是不是null,而且还得响应点击事件,代码量会不会很大,是不是在重复一些没必要的代码?

所以,用到自定义EditText,这样的好处就是,不仅在当前项目可以用,以后在别的项目,遇到这个需求的时候,也可以拿过来直接用,起到了完美封装的作用~~
OK了!废话不多说了!自定义EditText代码如下:

public class MyEditText extends EditText implements View.OnFocusChangeListener , TextWatcher {
    private Drawable mClearDrawable;
    public MyEditText(Context context) {
            this(context,null);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.editTextStyle);
    }

    public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mClearDrawable = getResources().getDrawable(R.drawable.close);//设置一键清除EditText里内容的叉号资源图片
        mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());
        setClearIconVisible(false);
        this.setOnFocusChangeListener(this);
        this.addTextChangedListener(this);
    }
    /**
     * 当输入框里面内容发生变化的时候回调的方法
     */
    @Override
    public void onTextChanged(CharSequence s, int start, int count, int after) {
        setClearIconVisible(s.length() > 0);
    }
    /**
     * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去
     */
    protected void setClearIconVisible(boolean visible) {
        Drawable right = visible ? mClearDrawable : null;
        setCompoundDrawables(getCompoundDrawables()[0],
                getCompoundDrawables()[1], right, getCompoundDrawables()[3]);
    }
    /**
     * 因为我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件
     * 当我们按下的位置在EditText的宽度 - 图标到控件右边的间距 - 图标的宽度和
     * EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向没有考虑
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (getCompoundDrawables()[2] != null) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
                boolean touchable = event.getX() > (getWidth() - getPaddingRight() - mClearDrawable.getIntrinsicWidth())
                        && (event.getX() < ((getWidth() - getPaddingRight())));
                if (touchable) {
                    this.setText("");
                }
            }
        }
        return super.onTouchEvent(event);
    }
    /**
     * 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏
     */
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            setClearIconVisible(getText().length() > 0);
        } else {
            setClearIconVisible(false);
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
}

——————————————————————————————————————————————————————————
下面看一下小程序中是如何实现的。也很简单,不解释。清空的功能主要就是动态传递一个空字符串过去就行了 哈哈哈~
wxml

<view class='input_container'>
  <image class='icon_search' src='../../image/icon_search.png' bindtap='searchContent'></image>
  <input placeholder='输入内容' bindinput='getValue' value='{{inputValue}}' confirm-type='search' bindconfirm='search'></input>
  <image class='icon_delete' src='../../image/icon_delete.png' bindtap='clearValue' hidden='{{!showDeleteIcon}}' ></image>
</view>

wxss:

.input_container {
  display: -webkit-flex;
  display: flex;
  height: 24px;
  border: 1px solid #ccc;
  align-items: center;
  margin: 20px;
  padding-left: 10px;
  padding-top: 4px;
  padding-bottom: 4px;
}

.icon_search {
  width: 20px;
  height: 20px;
  margin-right: 6px;
}

input {
  height: 20px;
  flex: 1;
  font-size: 14px;
}

.icon_delete {
  width: 20px;
  height: 20px;
  padding-right: 20px;
}

js:

var value = '';
Page({

  /**
   * 页面的初始数据
   */
  data: {
    showDeleteIcon: false,//是否显示叉号图标
    inputValue: ''//input中的值
  },

  //判断输入框是否有值
  getValue: function (e) {
    value = e.detail.value
    if (value != '') {
      this.setData({
        showDeleteIcon: true
      });
    } else {
      this.setData({
        showDeleteIcon: false
      });
    }
  },

  //清空输入框中的值
  clearValue: function () {
    this.setData({
      inputValue: '',
      showDeleteIcon: false
    });
  },

  //搜索
  search:function(e){
      wx.showToast({
        title: e.detail.value,
      })
  },
})

效果图如下:
这里写图片描述
——————————————————————————————————————————————————————————————
下面说一下ListView item项中多edittext的问题,下面以一个Edittext为例进行说明。多个同理。
有时候,我们项目需求会遇到ListView中多edittext同时提交的需求。当用到ListView复用上下滚动时,难免会出现输入框已经输入过的内容出现错乱的情况。

主要就是在adapter的getView()中数据绑定的地方进行设置:

        //绑定数据
        final ThemeTalkerBean bean = list.get(position);
        //为了保存已经输入过的信息,需要先清除监听
        if (item.et_talker_name.getTag() instanceof TextWatcher) {
            item.et_talker_name.removeTextChangedListener((TextWatcher) item.et_talker_name.getTag());
        }


        TextWatcher talkerWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (TextUtils.isEmpty(s)) {
                    bean.setTalkerName("");
                } else {
                    bean.setTalkerName(s.toString());
                }
            }
        };
        item.et_talker_name.addTextChangedListener(talkerWatcher);
        item.et_talker_name.setTag(talkerWatcher);

ThemeTalkerBean 这个bean就是用来保存每个item中edittext输入的内容的。最好提交的时候,提交bean里面的信息就行了。

Android自定义EditText实现多清除按钮功能 EditText是Android中用于获取用户输入文本的控件,它是TextView的子类,并增加了一些用于编辑文本的功能。在移动应用开发中,EditText是一种非常常见的界面元素,广泛应用于各种表单输入场景。EditText是Android应用中常用的输入控件,用于接收用户文本输入。在自定义EditText布局设计时,了解和应用其XML属性是非常重要的。以下是一些常用的属性及其作用的详细解释:android:id。 阅读详情

相关推荐

Palantir的Ontology:从静态知识图谱到动态业务引擎的跃迁

本文探讨了Palantir的Ontology技术如何将静态知识图谱升级为动态业务引擎。通过引入函数和行动作为核心元素,Ontology实现了业务逻辑的自动化响应与执行,显著提升物流、能源等领域的运营效率。文章详细解析了其混合存储引擎、状态监听网络等关键技术设计,并对比展示了传统架构与Ontology架构的业务价值差异。

weixin_42570296的博客 200

Android自定义具有清除输入的EditText

最近在做毕设,参照美团UI的时候,发现美团的输入框在输入的时候在右面会出现一个小叉,点击之后可以清除输入的内容: 花点时间实现一下实现目标:在没有输入内容的时候,清除图标是隐藏的,当输入内容时,清除图标出现,点击可以清除输入的内容,清除之后隐藏清除图标。创建一个类EditTextWithDelete,继承EditText public class EditTextWithDelete extend

gaozhan_csdn的博客 1287

2022年全国职业院校技能大赛高职组大数据技术与应用赛项赛卷⑩—解析答案

工业互联网是工业全要素、全产业链、全价值链的全面连接,是人、机、物、工厂互联互通的新型工业生产制造服务体系,是互联网从消费领域向生产领域、从虚拟经济向实体经济拓展的核心载体,是建设现代化经济体系、实现高质量发展和塑造全球产业竞争力的关键支撑。加快发展工业互联网产业,不仅是各国顺应产业发展大势,抢占产业未来制高点的战略选择,也是我国推动制造业质量变革、效率变革和动力变革,实现高质量发展的客观要求。 为完成工业大数据分析工作,你所在的小组将应用大数据技术,以Scala作为整个项目的基础开发语言,基于大数据平台综

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 582

EditText详解与自定义

  一、常用属性设置      1、文字过滤设置         android:inputType="text" //软键盘为数字字母风格         android:inputType="textAutoComplete" //自动完成         android:inputType="textUri" //输入网址         android:inputType="textEm...

一杯清泉 3683

使用Simulink进行基于IIR滤波器的设计与稳定性分析仿真

IIR滤波器的稳定性与其系统函数的极点位置密切相关。如果所有极点都位于Z平面的单位圆内,则该滤波器是稳定的;否则,滤波器将是不稳定的。在设计IIR滤波器时,确保其稳定性对于避免输出信号发散至关重要。明确你的系统需求,比如输入信号类型(如正弦波)、采样率、IIR滤波器的设计参数(如滤波器类型、阶数、截止频率等)。假设我们需要设计一个低通IIR滤波器,用来去除高于500Hz的所有频率成分,保留低于500Hz的信号成分。采样率为8kHz。

xiaoheshang_123的博客 150

【异常】安装hermes-agent时Git克隆大仓库报错:error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly: CAN

摘要:本文分析了Ubuntu服务器执行Git递归克隆时出现的网络传输中断错误(HTTP/2流异常关闭、数据截断)。主要原因是网络限制、协议兼容问题和缓冲区不足。提供了四种解决方案:1)扩大Git HTTP缓冲区;2)切换为HTTP/1.1协议;3)采用浅克隆+分步拉取子模块;4)网络优化措施。重点推荐浅克隆分步拉取作为最有效方案,所有方法无需重启即可生效,可快速解决大仓库递归克隆失败问题。

奶爸的编程之路,也就一周冷个三天 670

Android 自定义EditText

定义一款可清空内容的 EditText 和可显示密码的 EditText,支持修改提示图标和大小、背景图片等。

xiangxiongfly 1444

【数据集】中国大气污染物数据集CHAP(1km空间分辨率)-韦晶团队

中国大气污染物数据集CHAP(1km空间分辨率)-韦晶团队

WW、forever的博客 2596

在ContextMenu中添加/删除ListView的Item

  我们在写Android程序的时候,免不了要使用ListView,也免不了要使用ContextMenu,但是如何将其结合起来呢。比如Contacts程序是如何删除练习人的呢。 添加或则删除一个tem有不同的方式,添加Item可以使用ListView自身带的add()方法即可,但是在ContextMenu中删除这个Item还是有些麻烦的。 下面是一个小例子: 1、可以在EditText中输...

whatsyourname的专栏 274

华为面试手撕真题【字符串压缩】

华为面试手撕真题【字符串压缩】

MISAYAONE的博客 1万+

从零到一,打造你的无人机侦察兵!树莓派+Python+MQTT,实时目标检测全攻略

物联网、人工智能与计算机视觉三大前沿技术的深度融合。

u013558123的博客 1473

android之Listview动态显示多个EditText的动态添加删除

android之Listview动态显示多个EditText的动态添加删除 最近开发的项目中有一个需求,在一个Listview里面动态添加Item,Item包含两个EditText控件,做了很多尝试,发现,要么EditText输入监听异常,要么编辑后,删除错乱或者添加数据取得时候出现了问题。现在就分享出来吧! 首先是我们Activity的布局,一个ListView控件用来做展示,一个Button添...

smile_tear的博客 769

GJB 5000B二级-II实施基础

本文主要描述GJB 5000B二级II实施基础与GJB 5000A的变化情况,以及过程域各条款的实施要点

Abel的博客 2581

ListView与带EditText的item冲突问题

注意:在复用情况下冲突问题无法解决 网上所有的可能性与实现方式我都实验了一边,亲测当动态添加带有EditText的item时,如果使用了复用的方式,无论怎么处理ListView与EditText始终存在冲突。最后我的解决方式只有采用不复用的方式来处理,但滑动存在卡顿需要寻找其他实现方式,这里只是我比较蠢的一种解决方案。 问题 出现的问题主要是,焦点与数据状态保存问题。 分析 大家都知道,Li

HelloLollipop的博客 538

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android listview 动态edittext,解决ListView中包含EditText数据混乱原理

要求:屏幕中显示一个listview,其中每一个item都有一个editText,在任一editText上输入内容,快速上下滑动,保证数据不混乱。这是一道面试题,初看没什么,应该会很简单,但实际解决起来没那么简单,先上解决代码。packagecom.zhiren.mytestok;importandroid.content.Context;importandroid.text.Editabl...

weixin_29733427的博客 898

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android listview 动态删除行,listview 动态的添加或删除item

MainActivityimport android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ListView;import com.threepapa.virtualmachine.R;import com.threepapa.virtualmachine.adap...

weixin_34805367的博客 602

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

实现类似listView中动态添加Item的功能

实现类似listView中动态添加Item的功能功能描述每个Item中包含EditText,具体有多少个Item也不定,用户可以添加和删除,然后再保存用户输入的值。 本人愚钝,用listview无法实现 ,但后来发现其实也不需要,可能描述不准确,网上也没搜到相关的功能。搜索的关键词也很重要啊。实现其实挺简单,只是当时对android view 的方法不熟,其实就是在一个viewGroup中

chaixiangyang123的专栏 8265

listView中item带编辑框,输入、数据错乱等问题

在项目中,listview控件使用率是很高的,自然的,viewHolder就是必备了,这个view的复用,在某些情况下,会引发其他问题,由于复用机制问题(顶部滑出的itemView,会被底部滑出的复用),所以,如果是存在输入框的情况下,输入一行内容,其他复用的对应行,也会相应的填充下同样的内容,如下: 2.同样,我们尝试着删除输入项的内容,也会发现被复用的item内容也被删除了 我...

u013346208的博客 1563

Android ListView的item背景色设置以及item点击无响应等相关问题

            Android ListView的item背景色设置以及item点击无响应等相关问题   在Android开发中,listview控件是非常常用的控件,在大多数情况下,大家都会改掉listview的item默认的外观,下面讲解以下在使用listview时最常见的几个问题。 1.如何改变item的背景色和按下颜色   listview默认情况下,item的背景色是黑色,...

weixin_33935777的博客 136

自定义控件——可拖拽排序的ListView (在ListView的item中有EditText控件)

前言 跟进上篇:拖拽排序的ListView;有EditText控件的listview的拖拽! 实现步骤如下: 一:在MainActivity中; public class MainActivity extends AppCompatActivity { private DragListView mLv; private ArrayList mDatas; @Ov

学习就是我的个性 492

android ListView内数据的动态添加与删除

/在重构adapter的时候不至于数据错乱。i++){ //listview初始化3个子项。//从集合中删除所删除项的EditText的内容。android:text=“删除”

2401_86372554的博客 568

在listview的item中使用EditText,刷新后保存数据的方法

class adapter extends BaseAdapter { List list; public youkexinxi_adapter(List list) { this.list = list; } @Override public int getCount() {

Android 1477

java动态增加删除文件,android ListView内数据的动态添加与删除实例代码

main.xml 文件: android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal">android:layout_width="fill_parent"android:layout_height="fill_parent"android:orien...

weixin_34567845的博客 120

在ContextMenu中添加/删除ListView…

我们在写Android程序的时候,免不了要使用ListView,也免不了要使用ContextMenu,但是如何将其结合起来呢。比如Contacts程序是如何删除练习人的呢。 添加或则删除一个tem有不同的方式,添加Item可以使用ListView自身带的add()方法即可,但是在ContextMenu中删除这个Item还是有些麻烦的。 下面是一个小例子: 1、可以在EditTex

fe学习之旅 752
上一篇: 二维码扫描
下一篇: DrawerLayout侧滑菜单
尘彦
博客等级 码龄11年 92粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘彦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值