【问题标题】:Save Boolean state while restarting the application重新启动应用程序时保存布尔状态
【发布时间】:2018-11-14 20:07:37
【问题描述】:

我有 6 个布尔变量,我已将其初始化为 false。有 6 个不同的图像视图与这 6 个布尔假变量相关联。当用户单击这些图像中的任何一个时,相应的布尔变量将切换为 true,而当用户再次单击同一图像时,它将变为 false,就像打开和关闭一样。对所选选项满意后,用户可以单击完成按钮,数据将根据哪些选项为真,哪些为false,保存在firebase中。

我的问题是,每当应用程序重新启动时,所有布尔变量都会再次初始化为 false,我理解这样一个事实,即 OnCreate 类的应用程序重新启动,因此变量再次为 false。即使在应用程序重新启动后,如何编写可以保存这些变量状态的特定代码?

以下是我的代码:

    boolean checkcar = false, checkPickUp = false, checkTruck = false, checkCycle = false, checkBike = false, checkMen = false;
  private FirebaseAuth firebaseAuth;
private String currentUserID;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    myTransport = inflater.inflate(R.layout.fragment_transport, container, false);
    firebaseAuth = FirebaseAuth.getInstance();

    currentUserID = firebaseAuth.getCurrentUser().getUid();
    carImage = myTransport.findViewById(R.id.carTransport);
    pickUpImage = myTransport.findViewById(R.id.pickUpTransport);
    truckImage = myTransport.findViewById(R.id.truckTransport);
    cycleImage = myTransport.findViewById(R.id.cyclerTransport);
    bikeImage = myTransport.findViewById(R.id.bikeTransport);
    menImage = myTransport.findViewById(R.id.menTransport);
    done = myTransport.findViewById(R.id.selectUserTransportBtn);
    transport = FirebaseDatabase.getInstance().getReference().child("UserProfileDetails").child(currentUserID).child("Transport");



    MarkUserRegisteredTransport();


    carImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

    if (!checkcar) {
        carImage.setColorFilter(carImage.getContext().getResources().getColor(R.color.TransportAfterClicked), PorterDuff.Mode.SRC_ATOP);
        checkcar = true;
    } else {
        carImage.setColorFilter(carImage.getContext().getResources().getColor(R.color.colorAccent), PorterDuff.Mode.SRC_ATOP);
        checkcar = false;
    }
        }
    });


    pickUpImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             if (!checkPickUp) {
        pickUpImage.setColorFilter(pickUpImage.getContext().getResources().getColor(R.color.TransportAfterClicked), PorterDuff.Mode.SRC_ATOP);
        checkPickUp = true;
    } else {
        pickUpImage.setColorFilter(pickUpImage.getContext().getResources().getColor(R.color.colorAccent), PorterDuff.Mode.SRC_ATOP);
        checkPickUp = false;
    }
        }
    });

    truckImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             if (!checkTruck) {
        truckImage.setColorFilter(truckImage.getContext().getResources().getColor(R.color.TransportAfterClicked), PorterDuff.Mode.SRC_ATOP);
        checkTruck = true;
    } else {
        truckImage.setColorFilter(truckImage.getContext().getResources().getColor(R.color.colorAccent), PorterDuff.Mode.SRC_ATOP);
        checkTruck = false;
    }
        }
    });

    cycleImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!checkCycle) {
        cycleImage.setColorFilter(cycleImage.getContext().getResources().getColor(R.color.TransportAfterClicked), PorterDuff.Mode.SRC_ATOP);
        checkCycle = true;
    } else {
        cycleImage.setColorFilter(cycleImage.getContext().getResources().getColor(R.color.colorAccent), PorterDuff.Mode.SRC_ATOP);
        checkCycle = false;
    }
        }
    });

    bikeImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


    menImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!checkMen) {
        menImage.setColorFilter(menImage.getContext().getResources().getColor(R.color.TransportAfterClicked), PorterDuff.Mode.SRC_ATOP);
        checkMen = true;
    } else {
        menImage.setColorFilter(menImage.getContext().getResources().getColor(R.color.colorAccent), PorterDuff.Mode.SRC_ATOP);
        checkMen = false;
    }

        }
    });

此时用户可以点击完成,信息在 Firebase 中更新为 true 或 false 与他们的 res

    done.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                   HashMap userTransport = new HashMap();
    userTransport.put("check Car", checkcar);
    userTransport.put("check PickUp", checkPickUp);
    userTransport.put("check Truck", checkTruck);
    userTransport.put("check Cycle", checkCycle);
    userTransport.put("check bike", checkBike);
    userTransport.put("check Men", checkMen);

    transport.updateChildren(userTransport).addOnCompleteListener(new OnCompleteListener() {
        @Override
        public void onComplete(@NonNull Task task) {
            if (task.isSuccessful()) {
                Toast.makeText(getContext(), "Transportation information updated", Toast.LENGTH_LONG).show();

            } else {
                String message = task.getException().getMessage();
                Toast.makeText(getContext(), "Error Occured: " + message, Toast.LENGTH_SHORT).show();
            }
        }
    });
        }
    });
    return myTransport;
}

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    根据您的评论:

    我需要存储数据,即使在用户删除应用程序之后,就像 instagram 和 facebook 一样

    我想告诉你,SharedPreferencesBundle 在这种情况下都无济于事。这两种技术在使用时都不会在应用程序卸载后持续存在。如果您重新安装该应用程序,您的SharedPreferences 或您的Bundle 将是空的,您将无法使用任何数据。

    为了解决这个问题,我建议您将该数据添加到数据库中,并且每次用户想要更新他的偏好时,相应地更改数据库中的数据。因此,在您的 transport 对象下创建六个布尔类型的新属性,并根据用户的选择相应地设置/更新它们。

    【讨论】:

    • 嗨乔!你有没有试过我上面的解决方案,它有效吗?
    • 完成...对不起,我是堆栈溢出的新手。所以要熟悉事物..无论如何都谢谢
    【解决方案2】:

    您可以使用 onSaveInstanceState 来保存布尔值,并在 onCreate 或 onRestoreInstanceState 中获取值。

    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("boolean1", booleanValue1);
        outState.putString("boolean2", booleanValue2); //and so on
    
    }
    
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    
        if(savedInstanceState!=null){
           if(getString("boolean1") != null){
            booleanValue1 = savedInstanceState.getString("boolean1");
           }
        }
    
    }
    

    【讨论】:

    • 当应用程序被完全销毁并从头开始重新打开并且多个用户可以运行应用程序并选择布尔选项时,此代码是否可以工作???
    • @joewalker 您可以随时将值保存在文本文件中,并在需要时检索这些值。
    • 您可以使用 sharedpreference 来存储布尔值,直到应用数据被清除或卸载后才会被销毁。
    【解决方案3】:

    使用SharedPreferences,如果应用程序被杀死,保存的值不会被删除或重置。

    PreferenceManager mManager = PreferenceManager.getDefaultSharedPreferences(context);
    
    //example methods
    
    public static boolean getBool(String resName, boolean defValue) {
            return mManager.getBoolean(resName, defValue);
        }
    
    public static void setBool(String resName, boolean value) {
        mManager.edit()
                .putBoolean(resName, value)
                .apply();
    }
    

    PS:好吧,如果您卸载应用或删除应用数据(例如在“设置”中),数据将被销毁

    【讨论】:

    • 好吧,即使在用户删除应用程序之后,我也需要存储数据,就像保存帐户数据的 instagram 和 facebook 一样...我想我应该在用户访问时从 firebase 检索数据活动,这样他最新保存的数据将始终在 oncreate 中检索并将它们分配给布尔变量
    • @joewalker 好的,我建议您编辑您的问题,添加您需要的行为(重新安装应用程序后检索数据等)。您可以遵循两种方式:将数据存储在远程数据库上,然后通过请求检索它,或者您可以在存储上创建物理备份并重新加载它
    猜你喜欢
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多