如何创建一个创建 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 并允许程序员设置不同行为的类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 onTextChanged() 中使用 setSpan() 来保存 onTextChanged() 的参数?

如何创建一个jquery li rotator

如何找到动态创建的 li 的宽度 [重复]

如何在当前节点下创建一个包裹当前节点文本的新节点?

如何创建节点,添加内容?

Android 在 onTextChanged 中调用 setText