我是一名新开发人员,正在编写一个在切换开关时记录位置的应用程序。当我切换它时,我的开关可以工作,但是当我将应用程序移出最前沿时,它会失去其状态。如何保持android开关onPause和onResume的状态?
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
// set view, initiate switch
Switch mainSwitch = (Switch) findViewById(R.id.mainSwitch);
// deal with switch
mainSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@SuppressLint("MissingPermission")
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// if switch is on
if (isChecked) {
logLocation();
}
} else if (!isChecked) {
stopLocation();
}
// true if the switch is in the On position
Log.v("@@@@@@@@@@@@@=", "" + isChecked);
}
});
}
答案 0 :(得分:0)
添加答案,而不是继续评论。
默认情况下,当且仅当您使用默认组件(表示TextView
,Button
,Switch
等)时,Android才会保存UI的状态。 ID。仅当操作系统终止该应用程序并且用户返回该应用程序时,此状态才会继续存在。这意味着,如果用户按下Home
按钮,然后在以后返回您的Activity
,则该特定Activity
的所有默认组件的UI状态将恢复。按下Home
按钮时,Activity
将停止并被调用onSaveInstanceState
,因此,您可以在其中保存任何默认组件未维护的状态或有一些数据的状态例如,您下载的用于填充数据的UI组件。
如果用户按下Back
按钮,则该应用将被终止,并且默认情况下不会恢复任何UI状态。
为了解决这个问题,您可以使用SharedPreferences
或任何其他本地存储机制来将UI状态基本上存储到磁盘。
我添加了一段代码,展示了如何使用不同的方法。
在您的情况下,您不需要onSaveInstanceState
方法实现,因为您有一个默认的UI组件,它知道如何保存自己的状态,并且如上所述,Android已经为您自动完成了此工作。
两种状态(savedInstanceState
以及进入SharedPreferences
的内容都应在onCreate
方法中恢复,因为无论何时重新创建Activity
或每次创建{是第一次创建的,而onRestoreInstanceState
可能不会一直被调用。
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getName();
private static final String CHECKBOX__STATE = "CHECKBOX__SAVE_STATE";
private Switch checkbox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkbox = findViewById(R.id.checkbox);
final boolean isChecked;
if (savedInstanceState != null) {
isChecked = savedInstanceState.getBoolean(CHECKBOX__STATE);
} else {
isChecked = PreferenceManager.getDefaultSharedPreferences(this)
.getBoolean(CHECKBOX__STATE, false);
}
// Setting the state (if any) of the Switch.
checkbox.setChecked(isChecked);
checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Log.d(TAG, "onCheckedChanged: isChecked = true - log location");
} else {
Log.d(TAG, "onCheckedChanged: isChecked = false - stop logging location");
}
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(CHECKBOX__STATE, checkbox.isChecked());
}
@Override
protected void onDestroy() {
super.onDestroy();
PreferenceManager.getDefaultSharedPreferences(this)
.edit()
.putBoolean(CHECKBOX__STATE, checkbox.isChecked())
.apply();
}
}
我希望这会有所帮助:-)