如何保存开关按钮的状态?

时间:2018-02-08 13:26:37

标签: android android-layout button sharedpreferences android-togglebutton

我的应用程序有一个Switch。它用于打开Overlay Service。它工作正常,但问题是在切换状态。关闭应用程序后,当我重新启动应用程序时,其状态已更改。它似乎总是关闭。

public class MainActivity extends AppCompatActivity {

private AdView mAdView;
private WindowManager windowManager;
private BillingClient mBillingClient;
Switch aSwitch;


@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.essential);
    windowManager =  (WindowManager) getSystemService(WINDOW_SERVICE);


    aSwitch = (Switch) findViewById(R.id.switch_ph1);

    aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

            if (isChecked == true) {

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (Settings.canDrawOverlays(getApplicationContext())) {
                        start();
                    } else {
                        Toast.makeText(getApplicationContext(), "Please permit drawing over apps.", Toast.LENGTH_SHORT).show();
                        checkDrawOverlayPermission();
                    }
                } else {
                    start();
                }
            } else {
                stop();
            }


        }
    });

3 个答案:

答案 0 :(得分:1)

我发生的一种脑死亡方式是在共享首选项中保存按钮的状态。这种方式现在在您创建时,从共享首选项中读取数据并使用最后存储的值作为交换机的当前状态。

只有在删除时才会删除存储在共享首选项中的数据 1)用户卸载并重新安装该应用程序 2)用户明确进入应用程序设置并清除数据

了解如何使用共享偏好设置所需的一切:https://developer.android.com/training/data-storage/shared-preferences.html

答案 1 :(得分:0)

如果有任何数据类可用,则切换状态也可以存储在模型类级别以保存状态。 这样它也将保持listview中每个项目的开关状态。

答案 2 :(得分:0)

与上面提到的@Vardaan Sharma一样,SharedPreferences有一种方法可以持久保存状态。这意味着当应用程序被杀死并重新启动时,可以直接从SharedPreferences中提取状态。

还有另一种不持久的方式。使用onCreate方法提供的Bundle,您可以在onCreate中提取数据,然后将其保存到onSaveInstanceState()方法中的bundle中。这里有一个很好的例子:https://www.intertech.com/Blog/saving-and-retrieving-android-instance-state-part-1/

使用Google的新ViewModel(在Google I / O 2017中引入的新架构组件库中提供),您还可以保存状态并使用它。请参阅此链接以获取一个很好的示例:https://medium.com/google-developers/viewmodels-persistence-onsaveinstancestate-restoring-ui-state-and-loaders-fc7cc4a6c090

显然,你也可以在SQLite(或其他一些)数据库中保存布尔值,但我觉得在这种情况下它有点矫枉过正。