欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中多个EditText输入效果的解决方式

程序员文章站 2022-03-23 13:40:31
前言 在开发中,我们常常遇到这种情况 我们往往需要的是下面这种效果 但是如果把这些实现的代码写在activity中会比较麻烦,影响代码美观 解决方法...

前言

在开发中,我们常常遇到这种情况

Android中多个EditText输入效果的解决方式

我们往往需要的是下面这种效果

Android中多个EditText输入效果的解决方式

但是如果把这些实现的代码写在activity中会比较麻烦,影响代码美观

解决方法

于是就有了下面这个辅助类,禁用了按钮的点击事件和按钮的渐变色,可同时添加一个或者多个edittext

/**
 * 文本输入辅助类,通过管理多个textview或者edittext输入是否为空来启用或者禁用按钮的点击事件
 */
public final class textinputhelper implements textwatcher {

 private view mmainview;//操作按钮的view
 private list<textview> mviewset;//textview集合,子类也可以(edittext、textview、button)
 private boolean isalpha;//是否设置透明度

 public textinputhelper(view view) {
  this(view, true);
 }

 /**
  * 构造函数
  *
  * @param view    跟随edittext或者textview输入为空来判断启动或者禁用这个view
  * @param alpha    是否需要设置透明度
  */
 public textinputhelper(view view, boolean alpha) {
  if (view == null) throw new illegalargumentexception("the view is empty");
  mmainview = view;
  isalpha = alpha;
 }

 /**
  * 添加edittext或者textview监听
  *
  * @param views  传入单个或者多个edittext或者textview对象
  */
 public void addviews(textview... views) {
  if (views == null) return;

  if (mviewset == null) {
   mviewset = new arraylist<>(views.length - 1);
  }

  for (textview view : views) {
   view.addtextchangedlistener(this);
   mviewset.add(view);
  }
  aftertextchanged(null);
 }

 /**
  * 移除edittext监听,避免内存泄露
  */
 public void removeviews() {
  if (mviewset == null) return;

  for (textview view : mviewset) {
   view.removetextchangedlistener(this);
  }
  mviewset.clear();
  mviewset = null;
 }

 // 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 synchronized void aftertextchanged(editable s) {
  if (mviewset == null) return;

  for (textview view : mviewset) {
   if ("".equals(view.gettext().tostring())) {
    setenabled(false);
    return;
   }
  }

  setenabled(true);
 }

 /**
  * 设置view的事件
  *
  * @param enabled    启用或者禁用view的事件
  */
 public void setenabled(boolean enabled) {
  if (enabled == mmainview.isenabled()) return;

  if (enabled) {
   //启用view的事件
   mmainview.setenabled(true);
   if (isalpha) {
    //设置不透明
    mmainview.setalpha(1f);
   }
  }else {
   //禁用view的事件
   mmainview.setenabled(false);
   if (isalpha) {
    //设置半透明
    mmainview.setalpha(0.5f);
   }
  }
 }
}

在activity创建时添加监听

private textinputhelper minputhelper;

@override
protected void oncreate(bundle savedinstancestate) {
 super.oncreate(savedinstancestate);

 //创建一个辅助类,传入按钮操作view
 minputhelper = new textinputhelper(mbutton);
 //可添加一个或者多个edittext,当然也可以添加textview
 minputhelper.addviews(medittext1, medittext2, medittext3);
}

在activity销毁时移除监听(避免内存泄露)

@override
protected void ondestroy() {
 super.ondestroy();

 //移除引用,避免内存泄露
 minputhelper.removeviews();
}

需要注意的是这里不单单只是可以添加edittext,还可以添加textview,因为edittext是textview的子类,最后要是觉得好用记得点个赞。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。