如何创建一个创建 onTextChanged Listener 并允许程序员设置不同行为的类
Posted
技术标签:
【中文标题】如何创建一个创建 onTextChanged Listener 并允许程序员设置不同行为的类【英文标题】:How to create a class that creates onTextChangedListener and allows the programmer to set different behaviors 【发布时间】:2014-09-09 21:41:22 【问题描述】:我在 android 上编程,我想要一种简单的方法来执行以下操作,而不必有一堆覆盖和丑陋的代码:
这些都是例子:
当 editText1 更改时,我希望使用用户键入的内容的副本更新 TextView editText2 到 editText10 也是一样的。 当 editText11 更改时,我想将其中的数字乘以 10 并将其放入某个 TextView 中。 当 editText12 变为 0 时,我希望隐藏一些 LinearLayouts基本上,我希望能够轻松设置监听器并修改监听器将触发的方法类型,而不需要一堆匿名内部类和其他讨厌的东西。有许多衍生品,每个衍生品都做自己的预定义事情是可以的,但我想避免重复代码并使其利用多态性。
我非常努力地尝试使用接口、抽象方法和其他类似的技术,但这让我发疯了。
【问题讨论】:
这不是关于 android 开发,而是关于继承、接口和扩展。而且我没有读过任何书,即使没有教程也很容易。 这基本上是一个TextWatcher。你可以在里面做任何你想做的事情。没有比这更通用的了。 专业提示:在英语中,I
总是大写(当它用来指代自己时)。
Robert Harvey 我知道我正在尽我所能努力去忘记它。 @Gabe Sechan 我知道如何设置文本监听器,但我不知道如何制作,以便我可以为每个监听器设置自定义方法。
@jammaster 您在每个编辑文本上设置了不同的侦听器。然后每个编辑文本都有自己的自定义方法。您无需设置一个,它适用于所有编辑文本,并且您不限于一个 TextWatcher 对象。
【参考方案1】:
为什么不试试这样的自定义 TextWatcher 与事件侦听器回调,您可以在文本更改后使用:
public class CustomTextWatcher implements TextWatcher
public interface TextChangedEventListener
public void afterTextChanged(String newText);
private TextChangedEventListener eventListener;
public CustomTextWatcher(TextChangedEventListener eventListener)
this.eventListener = eventListener;
@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)
eventListener.afterTextChanged(s.toString());
现在开始实施...
EditText editText = (EditText)findViewById(R.id.my_et);
editText.addTextChangedListener(new CustomTextWatcher(new CustomTextWatcher.TextChangedEventListener()
public void afterTextChanged(String newText)
// set the text of the next EditText, which will trigger the next TextWatcher in the chain
));
您仍然需要处理匿名内部类,但如果您想为每个 EditText 进行自定义,则没有真正的解决方法。至少这会将内部类的数量从 3 减少到 1,并清理您必须查看的代码。
【讨论】:
这似乎有点毫无意义。它有很多代码和额外的间接级别,以避免将两个空函数添加到其他类? 是的,我清楚地说明了这一点。但是,无论如何,它看起来仍然比拥有 11 个 EditText 更干净,每个 EditText 有 2 个未使用的匿名内部类。 @Guardanis 这是在正确的轨道上。这检查了我尝试做的大约一半。非常感谢。问题是我可能需要一些这样的听众来处理几个不同的 EditText。为此,我必须重复上面的代码。我想要一些东西,我可以只调用一个方法,该方法接收一个应该被监听的 EditText 和一个应该在监听器触发时执行的方法。这样我只需要一个调用来设置多个监听器。 如果您只在链中的第一个 EditText 上观看文本更改事件(假设其他 EditText 不可编辑),那么您可以创建一个更改所有 EditText 文本的方法基于主要输入。如果您希望每个人都对其接收到的内容进行动态响应,则单个 TextWatcher 将无法工作,并且需要为您要为其处理事件的每个 EditText 自定义实现的 TextWatcher 的新实例。最动态的方法可能是为每个 EditText 创建一个新实例并在匿名内部类中处理结果 我知道这并不漂亮,但替代方案更加混乱,即使是微小的更改也需要对代码进行大量修改。这种解决方案更易于维护,因为任何更新都可以在链中的任何点完成,而不会导致您重构大部分代码。【参考方案2】:你可能想要的是TextWatcher
How to use the TextWatcher class in Android?
这是一个例子:
http://www.learn-android-easily.com/2013/06/using-textwatcher-in-android.html
您可以将 TextView 对象传递给它,并在用户输入文本时对其进行监视。但是,根据您所描述的要求以及一般用户的一般不可预测的行为,即使这也可能非常复杂。
【讨论】:
以上是关于如何创建一个创建 onTextChanged Listener 并允许程序员设置不同行为的类的主要内容,如果未能解决你的问题,请参考以下文章