2016-12-09 51 views
2

切换方向更改后保持检查状态,即使我将程序设置为false。Android - 切换方向后继续检查

这里是一个例子代码:

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,但开关不断的接口上进行检查。这是布局文件中的开关xml元素:

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

我在想什么?

回答

0

您的复选框未在Orientation Change检查的原因是,Android的触发活动方法上Orientation Change像这样:

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

如果你想sw.setChecked(false);火上取向的转变将其放在活动的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(Configuration)( )。 重新启动。

,并通过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"); 
} 
+0

非常感谢!我知道生命周期,但我正在使用'onStart()'方法而不是'onResume',这让我发疯了!我现在正在做第二种选择,但我认为,对我而言,使用第一种选择更合理。 –

+0

当然,您也可以通过第三个选项始终保持用户选择。最好的部分是有几个选择使用取决于实施。 – Illdapt

0

更普遍,你可能要重写以下,这样就可以保持状态像这样当方向改变(和活动重新创建)

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

如果设置了savedInstanceState,则将其读回onCreate

+0

是的,我现在正在做同样的事,谢谢你的回答!正如Illdapt解释的那样,我正在考虑如何在不使用Bundle的情况下做到这一点,我认为这将是我的选择。 –