重新启动应用程序时保存布尔状态

时间:2018-11-14 08:42:30

标签: java android firebase firebase-realtime-database

我有6个布尔变量,它们已初始化为false。有6个不同的imageviews与这6个布尔false变量相关联。当用户单击这些图像中的任何一个时,相应的布尔变量将切换为true,而当用户再次单击同一图像时,它将变为false,就像打开和关闭一样。对选定的选项感到满意之后,用户可以单击“完成”按钮,数据将根据哪些选项正确,哪些false相应地保存在Firebase中。

我的问题是,每当重新启动应用程序时,所有布尔变量都将再次初始化为false,我了解到这样的事实,由于变量又为false,因此应用程序针对OnCreate类重新启动。我该如何编写某些代码,甚至在应用程序重启后也可以保存这些变量的状态?

下面是我的代码:

    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中使用res的true或false更新信息。

    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;
}

4 个答案:

答案 0 :(得分:1)

根据您的评论:

  

好,即使用户删除了instagram和facebook这样的应用程序,我也需要存储数据

我想告诉您,在这种情况下SharedPreferencesBundle都无济于事。使用这两种技术时,它们不会在应用程序卸载期间持续存在。如果您重新安装该应用程序,则SharedPreferencesBundle将为空,并且您将完全无法使用任何数据。

为解决此问题,建议您将数据添加到数据库中,并且每次用户想要更新其首选项时,都应相应地更改数据库中的数据。因此,请在transport对象下创建boolean类型的六个新属性,并根据用户的选择相应地设置/更新它们。

答案 1 :(得分:0)

您可以使用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");
       }
    }

}

答案 2 :(得分:-1)

使用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:好吧,如果您卸载应用程序或删除应用程序数据(例如,在“设置”中),数据将被破坏

答案 3 :(得分:-1)

您可以使用sharedpreference完成它。您可以按如下方式保存布尔值。

Boolean isFirstRun = getSharedPreferences("PREFERENCE",MODE_PRIVATE).getBoolean("Key", true);

您可以像

一样更改布尔值。
  getSharedPreferences("PREFERENCE", MODE_PRIVATE).edit().putBoolean("Key", false).apply();