Сохранить логическое состояние при перезапуске приложения - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть 6 булевых переменных, которые я инициализировал как ложные. Есть 6 различных изображений, которые связаны с этими 6 логическими ложными переменными. Когда пользователь щелкает любое из этих изображений, соответствующая логическая переменная переключается в значение true, а когда пользователь снова щелкает то же изображение, оно становится равным false и отключается. После того, как вы будете удовлетворены выбранными параметрами, пользователь может нажать кнопку «Готово», и данные будут сохранены в базе данных, в зависимости от того, какие параметры являются истинными, а какие 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;
    }

        }
    });

здесь, когда пользователь может щелкнуть «Готово», и информация обновляется в базе данных с истиной или ложью с их разрешением

    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 голосов
/ 14 ноября 2018

Согласно вашему комментарию:

ну, мне нужно было сохранить данные даже после того, как пользователь удалит приложение, как Instagram и Facebook

Я хотел быскажу вам, что ни SharedPreferences, ни Bundle не помогут в этом случае.Оба метода при использовании не сохраняются при удалении приложений.Если вы переустановите приложение, ваш SharedPreferences или Bundle будет пустым, и вы вообще не сможете использовать какие-либо данные.

Чтобы решить эту проблему, я рекомендую вам добавить эти данные в базу данных икаждый раз, когда пользователь хочет обновить свои предпочтения, измените данные в базе данных соответственно.Так что создайте шесть новых свойств типа boolean под вашим transport объектом и установите / обновите их соответственно выбору пользователя.

0 голосов
/ 14 ноября 2018

Используйте 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: Хорошо, если вы удалите приложение или удалите данные приложения (например, в «Настройках»), данные будут уничтожены

0 голосов
/ 14 ноября 2018

Вы можете использовать sharedpreference , чтобы сделать это. Вы можете сохранить логическое значение следующим образом.

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

Вы можете изменить логическое значение как

  getSharedPreferences("PREFERENCE", MODE_PRIVATE).edit().putBoolean("Key", false).apply();
0 голосов
/ 14 ноября 2018

Вы можете использовать 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");
       }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...