我开始编写Android应用程序,我遇到了一个复选框问题。
我的活动中有一个复选框,我在OnCheckedChanged方法中输入一条日志消息,当选中复选框时,我会启动,但是当我旋转屏幕时,消息再次出现,好像OnCheckedChanged方法是自动调用的系统再次破坏并创建活动。
发生了什么事?感谢。
答案 0 :(得分:6)
我曾经遇到过这样的问题。最后我删除了OnCheckedChangedListener并用onClickListener替换它。 在onclick方法中,我使用c.IsChecked()。
我的猜测是,只要用户通过代码(通过c.setchecked(boolean))更改了复选框状态,android就会调用onCheckChange,
在你的情况下,c .setchecked(boolean)方法由android内部调用以恢复UI状态。
希望它会有所帮助。
答案 1 :(得分:6)
我多次使用的最好和最干净的解决方案是检查View.isPressed()。这是有道理的,因为用户在触发回调时会按下Switch。
private Switch.OnCheckedChangeListener mOnSwitch = new Switch.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (!buttonView.isPressed())
{
// Not from user!
return;
}
// Handle user check change
}
};
答案 2 :(得分:3)
Android会自动将复选框的状态保留为已保存实例状态的一部分,并在配置更改后将其重新应用于新活动中。当任何内容改变复选框 - 用户或框架的状态时,将调用OnCheckedChangeListener
。
答案 3 :(得分:0)
实际上,正如有人已经提到的那样,可以通过使用isPressed方法检测谁发起了“状态变化”事件,即它只响应用户操作。
但是,Switch控件存在一个问题,除了单击之外,还可以向左或向右拖动,这也会改变状态但isPressed方法不会检测到。我希望在Switch类中找到一个名为isDragged的方法,但是什么也没有。
很难相信他们忘了实施这样的事情,所以可能我错过了一些东西。
答案 4 :(得分:-3)
尝试在应用标记中的清单文件中添加以下行:
<activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">
也read this,这将解决您的问题。