2

因为我是第一次尝试切换(android 新手),所以我不知道如何处理这个问题。我有一个活动开关和一个附加的 setOnCheckedChangeListener() 到它。当调用活动的 oncreate 时,我对数据库进行异步调用,并根据收到的值设置开关的状态。现在的问题是,但是我将开关状态设置为仅显示它在 db 上的当前状态,并且还没有用户更改它,但仍然调用了 listner 函数。我知道代码工作正常,但是状态改变了列表器,我需要其他东西来确认用户已经改变了状态。我认为 onTouchEvent(MotionEvent event) 可以达到目的,但不知道如何将它与 switch.setOnCheckedChangeListener 结合使用

有没有人知道任何更好的解决方案,或者至少可以帮助我告诉我如何使用ontouch,即使是listner ......

sw_recording_switch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
   }}

谢谢 !!!

4

2 回答 2

3

确实在调用 Switch.setChecked(boolean); 时 OnCheckedChangeListener 也会被触发。我克服这个问题的方法是在调用 setChecked() 之前使用一个标志并将其设置为 false

这样,当您以编程方式使用 setChecked() 时仍会调用侦听器,但内部代码不会执行,除非用户按下开关。

    //prevent the code from listener to run, flag set to false before calling setChecked(true);
    should_run = false;
    toggle_facebook.setChecked(true);

    ....

    private OnCheckedChangeListener onSwitchSlided = new OnCheckedChangeListener()
    {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            switch(buttonView.getId())
            {
                case R.id.settings_toggle_facebook:
                {
                    if(true == should_run)
                    {
                        //do stuff
                    }

                    should_run = true;
                    break;
                }
                case R.id.settings_toggle_twitter:
                {
                    if(true == should_run)
                    {
                        //do stuff
                    }

                    should_run = true;
                    break;
                }
            }
        }
    };
于 2014-12-04T19:04:14.247 回答
1

处理初始化代码的两种方法,因此处理程序不会触发。

设计您的处理程序以识别它正在初始化。下面的示例使用 isResumed() 来确定代码是否正在初始化。这是因为 onCreate 在 onResume 之前被调用。

@Override
public void onCheckedChanged(RadioGroup rg, int checkId) {
    switch (rg.getId()) {
        case R.id.rgMileKilometer:
            switch (checkId) {
                // process the speed radio group
                case R.id.rdoMiles:
                    // Speed Radio Group check if the mph button is checked
                    isMile = true;
                    break;
                case R.id.rdoKilometer:
                    isMile = false;
                    // Speed Radio Group check if the mph button is checked
                    break;
            }
            if (isResumed()) {
                //do something the code is ready...
            }
    }
}

完成初始化后添加监听器

CheckBox cb = (CheckBox) view
            .findViewById(R.id.cbApplicationCacheTabs);
    cb.setChecked(isApplicationCacheTabs);
    cb.setOnCheckedChangeListener(this);
于 2014-12-04T18:55:07.377 回答