Android - Switch在方向更改后保持检查状态

时间:2016-12-09 18:37:24

标签: android

切换在方向更改后保持检查,即使我以编程方式设置了false。

以下是一个示例代码:

public class MainActivity extends AppCompatActivity {

    Switch sw;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sw = (Switch)findViewById(R.id.sw);
        sw.setChecked(false);

        System.out.println(sw.isChecked());
    }    
}

sout打印为false,但交换机会在界面上进行检查。这是布局文件中的switch xml元素:

<Switch
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/sw"
    android:checked="false"/>

我错过了什么?

2 个答案:

答案 0 :(得分:0)

Orientation Change未选中复选框的原因是Android会在Orientation Change上触发活动方法,如下所示:

onPause -> onSave -> onStop -> onCreate -> onStart -> onResume

如果您希望在方向更改时触发sw.setChecked(false);,请将其放在您的Activities onResume()函数中,如下所示:

//Other Code Above, i.e. onCreate();
@Override
public void onResume(){
    super.onResume();
    // Put your code here...
    sw.setChecked(false);
}

还有其他选项可阻止在配置更改

下按此Android Documentation重新启动活动
  

在某些特殊情况下,您可能希望绕过重新启动   基于一种或多种配置更改的活动。这是   在其清单中使用android:configChanges属性完成。任何   你会说你在那里处理的配置改变类型   接到您当前活动的电话   onConfigurationChanged(配置)方法而不是   重新启动。如果配置更改涉及任何您不这样做   但是,处理活动仍将重新启动   onConfigurationChanged(配置)将不会被调用。   重新启动。

最后通过onSaveInstanceState(Bundle savedInstanceState)onRestoreInstanceState(Bundle savedInstanceState)选择另一个选项:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  savedInstanceState.putBoolean("YourCheckBox", enable);
  super.onSaveInstanceState(savedInstanceState);
}

使用此方法检索它:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  boolean mychkbox = savedInstanceState.getBoolean("YourCheckBox");
}

答案 1 :(得分:0)

更一般地说,您可能希望覆盖以下内容,以便在方向更改(以及重新创建活动)时保留此状态

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(SOME_BOOL_VALUE, boolVar);
}

如果onCreate已设置

,请在savedInstanceState中阅读