J'essaye de faire une fonction qui ne sauvera qu'une vitesse plus élevée que celle déjà enregistrée. Mais la var en dehors de la boucle if est toujours 0,0, la valeur intérieure est différente. Quelqu'un connaît-il une solution ou même une meilleure idée de la façon de ne sauvegarder que la vitesse maximale?
private fun updateUI(speed: Double, distance: Double){
val df = DecimalFormat("0.0")
speed_text_view.text = df.format(speed).plus(" km/h")
distance_text_view.text = df.format(distance)
Log.e("getLocationUpdates", df.format(speed))
var getSpeedDouble = 0.0 //here is problem. The value doesn't change
if (speed > getSpeedDouble) {
val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
val editor = sharedPref.edit()
editor
.putString("SPEED", speed.toString())
.apply()
val getSharedPref = PreferenceManager.getDefaultSharedPreferences(this)
getSharedPref.apply {
val getSpeed = getString("SPEED", "")
getSpeedDouble = getSpeed!!.toDouble()
Log.e("GetSpeedDouble", getSpeedDouble.toString())
max_speed_text_view.text = getSpeed.toString()
}
}
}
3 Réponses :
private fun updateUI(speed: Double) {
var getSpeedDouble = 0.0 //here is problem. The value doesn't change
if (speed > getSpeedDouble) {
val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
val editor = sharedPref.edit()
editor.putString("SPEED", speed.toString()).apply()
val defaultSpeed = sharedPref.getString("SPEED", "")
getSpeedDouble = defaultSpeed.toString().toDouble()
Log.e("updateUI", getSpeedDouble.toString())
}
}
private fun getSpeed() {
var getSpeedDouble: Double
val sharedPref = PreferenceManager.getDefaultSharedPreferences(this)
val defaultSpeed = sharedPref.getString("SPEED", "")
getSpeedDouble = defaultSpeed.toString().toDouble()
Log.e("getSpeed", getSpeedDouble.toString())
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
updateUI(10.0)
getSpeed()
}
outputupdateUI: 10.0
getSpeed: 10.0
Cela fonctionne, mais pas comme je le voulais. Dans votre code, getSpeed ne fonctionne qu'une seule fois, lorsque l'application démarre. J'ai besoin d'un code qui vérifie toujours la vitesse du GPS et si l'ID de vitesse est supérieur au dernier, la vitesse affichée augmente. C'est le problème principal et je ne sais pas comment le compter correctement.
tu peux l'appeler à tout moment mon frère
Pour la postérité: Avoir la vitesse comme variable globale.
private fun updateUI(newSpeed:Double) {
if (newSpeed > speed)
{
speed = newSpeed
textview.setText((newSpeed).toString())
}
}
lorsque vous chargez l'activité, récupérez sa valeur dans les préférences partagées:
editor.putDouble(âSPEEDâ,speed) editor.commit()
lorsque vous avez terminé l'activité, écrivez la valeur dans le préférences partagées:
val preference = getSharedPreferences(yourApp, Context.MODE_PRIVATE) val editor = preference.edit() speed = preference.getDouble(âSPEEDâ,0.0)
dans votre méthode, attribuez simplement une nouvelle valeur à la variable uniquement si la lecture actuelle est plus grande que la valeur enregistrée.
val speed:Double = 0.0
Cela fonctionne, mais pas comme je le voulais, mais vous m'avez donné la solution. C'est une variable globale. J'ai également changé getSharedPreferences comme avant: val sharedPref = PreferenceManager.getDefaultSharedPreferences (this) et cela fonctionne comme je le voulais. Je vous remercie beaucoup pour votre aide.
@ beginner992 Je suis content que cela vous ait aidé.
Que diriez-vous de le ranger dans une classe agréable, et lors de l'initialisation de cette classe à partir de votre activité:
speedKeeper = MaxSpeedKeeper (ceci)
alors tout ce que vous avez à faire est de baisser vos vitesses (c'est-à-dire speedKeeper.speed = 10.4 ) et il restera à jour.
Apply () se mettra à jour sur disque asynchrone, mais la valeur dans sharedPref initialisé restera en cache et est lue à partir du objet compagnon > maxSpeed de toute façon.
De cette façon, vous pouvez simplement déposer votre speedkeeper dans tous les autres processus, classes, fragments, etc. et il continuera à faire ce qu'il fait, ou simplement l'initialiser à nouveau dans une nouvelle activité.
class MaxSpeedKeeper(context: Context) {
companion object {
const val SPEED = "SPEED"
const val SHAREDPREFS_NAME = "MY_SHAREDPREFS"
var maxSpeed = 0.0f
}
var speed: Double
get() = maxSpeed.toDouble()
set(speedToCheck) {
if (speedToCheck > maxSpeed) {
maxSpeed=speedToCheck.toFloat()
with(sharedPref.edit()) {
putFloat(SPEED, speedToCheck.toFloat()) // you could change this to a string or bits or something if you want more resolution than a float gives
apply()
}
}
}
private val sharedPref =
context.getSharedPreferences(SHAREDPREFS_NAME, Context.MODE_PRIVATE)
init {
maxSpeed = sharedPref.getFloat(SPEED, 0.0f)
}
}
Cela semble intéressant. Mon application actuelle n'a pas besoin de beaucoup de code, mais elle peut être utile dans de nombreuses autres applications. Merci.
"" Appliquer () faire de manière asynchrone Disque I / O Pendant que COMMIT () est synchrone ". Vous devez utiliser
.commit () code> sur les préférences partagées dans ce cas. En outre, pourquoi obtenir la valeur de SharedPreferences pour mettre à jourgetSpeeddouble code>? Juste fairegetSpeeddouble = vitesse code>que voulez-vous exactement, veuillez en préciser davantage
il semble que vous deviez changer
editor.putString ("SPEED", speed.toString ()). apply ()eneditor.putString ("SPEED", speed.toString ()). commit ()@LakhwinderSingh J'obtiens les données par locationManager et je sais comment obtenir de la vitesse, mais je veux aussi prendre la vitesse la plus élevée atteinte pendant la session.
À quel problème êtes-vous confronté?
@LakhwinderSingh La var getSpeedDouble doit changer de valeur, mais elle est toujours de 0,0. J'ai besoin de cette valeur pour vérifier si une boucle if ()
si ce n'est pas une boucle, premièrement
avez-vous essayé
commitau lieu deapplyOui, toujours pareil.
obtenez-vous ce journal
Log.e ("GetSpeedDouble", getSpeedDouble.toString ())? Sinon, ceif (speed> getSpeedDouble) {est toujours faux@sonnet J'ai Log. à l'extérieur de if () et la var getSpeedDouble vaut 0.0. getSpeedDouble à l'intérieur de if () change
s'il vous plaît vérifier ma réponse
pourquoi ne serait-il pas 0? Vous dites essentiellement "x = 0, si y> x (qui est toujours 0), faites quelque chose.
@Joozd Si la vitesse actuelle de locationManager est plus élevée que la précédente, cela devrait changer les données dans la vue texte. Les applications à exécuter ont une vue de texte avec une vitesse maximale pendant la course.
@Joozd Et c'est ce sur quoi j'écris. J'ai besoin d'une variable qui change constamment la valeur pour la comparer à la vitesse donnée par le GPS. Si la vitesse est plus élevée, je devrais voir une nouvelle valeur dans la vue texte. Le problème est dans var getSpeedDouble - il ne change pas. Donc si () fonctionne toujours
ont la vitesse comme variable globale. lorsque vous chargez l'activité, récupérez sa valeur dans les préférences partagées et lorsque vous avez terminé l'activité, écrivez la valeur dans les préférences partagées. dans votre méthode, attribuez simplement une nouvelle valeur à la variable uniquement si la lecture actuelle est plus grande que la valeur enregistrée. Gardez vos commits au lieu de postuler avec les préférences partagées et tout devrait bien se passer.
@NikosHidalgo Cela semble être une solution. Je vous ferai savoir plus tard si cela fonctionne, je ne peux pas le vérifier maintenant.