【问题标题】:how to skip switch.setOnCheckedChangeListener when status is not updated by user当用户未更新状态时如何跳过 switch.setOnCheckedChangeListener
【发布时间】:2014-12-04 18:45:05
【问题描述】:

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

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

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

谢谢!!!

【问题讨论】:

    标签: android ontouchlistener touch-event ontouch android-switch


    【解决方案1】:

    确实在调用 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;
                    }
                }
            }
        };
    

    【讨论】:

    • 谢谢@Goran...正在考虑同样的方式,您刚刚确认我应该这样做...按我的意愿工作...:D
    【解决方案2】:

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

    设计您的处理程序以识别它正在初始化。下面的示例使用 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 2021-11-01
      • 1970-01-01
      • 2020-11-22
      • 2021-04-03
      • 2020-09-09
      • 2016-09-23
      • 2016-11-27
      相关资源
      最近更新 更多