【问题标题】:Android Switch setOnCheckedChangeListener method to pass Object by applying DRY principleAndroid Switch setOnCheckedChangeListener方法通过DRY原理传递Object
【发布时间】:2016-07-21 15:11:59
【问题描述】:
toggle1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            try
            {
                String msg ="";
                if (isChecked) {
                    // The toggle is enabled

                    //msg = "Hello " + String.valueOf(!isChecked);
                    msg = "1";


                } else {
                    // The toggle is disabled
                    //msg = "Hello " + String.valueOf(!isChecked);
                    msg = "1";
                }
                msg += "\n";
                outputStream.write(msg.getBytes());

            }
            catch (IOException ex) { }
            catch (NullPointerException ex) { }



        }
    });

请考虑上面的代码。现在我有 1 Switch 这个代码 sn-p 已经足够好了。但是,如果我有 4 个开关,那么 4 次重复此代码 sn-p。所以这是重复的。 这里对于每个开关 toggl1 ->msg = "1";对于toggl2->msg =“2”; 每个地方都这样改变。

如何将对象传递给 setOnCheckedChangeListener 以便遵守 DRY 原则?

【问题讨论】:

  • 创建自己的 OnCheckedChangListener(扩展原来的)并使用构造函数传递对象
  • @Chol 如果你分享你的代码,我会从中学习。是的,我试图创造。但是 CompoundButton 类需要 Context。

标签: java android design-patterns dry


【解决方案1】:

你可以使用View的标签,然后像这样检索它

CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() {

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        try {
            String msg ="";
            if (isChecked) {
                // The toggle is enabled

                //msg = "Hello " + String.valueOf(!isChecked);
                msg = buttonView.getTag().toString()


            } else {
                // The toggle is disabled
                //msg = "Hello " + String.valueOf(!isChecked);
                msg = buttonView.getTag().toString()
            }
            msg += "\n";
            outputStream.write(msg.getBytes());

        } catch (IOException ex) {

        }
        catch (NullPointerException ex) {

        }
    }
};

toggle1.setTag("1");
toggle2.setTag("2");
toggle3.setTag("3");

toggle1.setOnCheckedChangeListener(listener);
toggle2.setOnCheckedChangeListener(listener);
toggle3.setOnCheckedChangeListener(listener);

onCheckChanged 传递的buttonView 是您切换的开关,它始终是您的切换变量之一

【讨论】:

  • });我无法匹配(
  • 已更新。忘记删除')'
  • 它有效。 setTag 是如何传递数据的?我想探索一下。
  • 标签是 View 类的成员。它可以用于各种目的,比如你的
【解决方案2】:

创建一个自定义的检查监听器:

private class customChecked implements CompoundButton.OnCheckedChangeListener {

    String msg;
    public customChecked(String mMsg){
        this.msg= mMsg;
    }
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        myString = msg;
    }
}

然后申请:

toggle1.setOnCheckedChangeListener(new customChecked(1));
toggle2.setOnCheckedChangeListener(new customChecked(2));

【讨论】:

  • 您的解决方案更透明
猜你喜欢
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
相关资源
最近更新 更多