假设我夸大了“模板”布局文件的几个副本,每个副本都包含一个Switch
,我在每个开关上设置一个OnCheckedChangeListener,如下所示:
switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (b) {
//Switch is "on"
} else {
//Switch is "off"
}
}
});
首先,这很好,除非我切换片段时,会在布局中为每个Switch
调用此侦听器,并将状态计为最近膨胀的状态Switch
是
实施例:
我膨胀了4个模板副本,并在创建时将它们插入到布局中。然后我将最近创建的Switch
切换为“on”。然后我更改片段,并为所有4个开关调用OnCheckedChanged
侦听器,boolean
确定checked
是否true
是switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (compoundButton.isPressed()) {
if (b) {
//Switch is "on"
} else {
//Switch is "off"
}
}
}
});
,无论其实际状态如何。
为了解决这个问题,我将监听器改为如下:
isPressed()
虽然这不会阻止在切换片段时调用侦听器,但它确实会阻止那些侦听器执行任何操作,这一切都很好,除非用户快速滑动,在这种情况下false
返回{ {1}}并未观察到预期的行为。
我无法确定用户是否启动了更改,或者是否是由某个自动进程启动的,我正在寻找或确定为什么每次我从一个更改为新片段时调用它们包含开关。
这种行为很奇怪,我想这是Switch
实施方式的结果。
预期行为:切换片段时,不会调用OnCheckedChanged侦听器。
观察:切换片段时调用所有侦听器。
之前是否有人遇到此问题并对此处发生的事情有任何解决方案或见解?
编辑:以下是观点被夸大的方式:
View template = activity.getLayoutInflater().inflate(R.layout.template, null);
然后获取对开关的引用:
final Switch switch = (Switch) template.findViewById(R.id.switch);
之前我做过这样的事情并且工作正常,我不能专门用Switch或类似的东西做这个吗?
我不需要在片段之间维护它们的状态,它们会导致在数据库中更新记录,无论新片段是否与旧片段相关,这都是一个问题。如果用户没有触摸或滑动Switch,我只需要不要调用监听器。
对于缺乏清晰度表示道歉。
答案 0 :(得分:0)
好吧,原来这是由重复的ID引起的。
为每个视图分配唯一ID似乎已经修复了它:
switch.setId(View.generateViewId());
感谢Alessio给我一个暗示他的评论。