因为我第一次尝试切换(Android新手)我不知道如何处理这个问题。我有一个活动开关和一个附加的setOnCheckedChangeListener()。当调用activity的oncreate时,我对数据库进行异步调用,并根据收到的值设置开关的状态。现在的问题是,然而我设置开关状态只显示它在db上的当前状态并且没有用户更改它,仍然调用listner函数。我知道代码工作正常但是使用状态更改列表器我需要其他东西来确认状态已被用户更改。我认为onTouchEvent(MotionEvent事件)可以填充目的,但不知道热与switch.setOnCheckedChangeListener结合使用它
有没有人知道任何更好的解决方案或至少可以帮助我告诉如何使用ontouch甚至使用listner ......
sw_recording_switch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
}}
谢谢!!!
答案 0 :(得分:4)
确实在调用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;
}
}
}
};
答案 1 :(得分:1)
处理初始化代码的两种方法,以便处理程序不会触发。
设计处理程序以识别它是初始化。下面的示例使用isResumed()来确定代码是否正在初始化。这是有效的,因为在onResume之前调用onCreate。
@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);