Как добавить пользовательские монеты в существующие монеты в Котлине? - PullRequest
1 голос
/ 10 октября 2019

Я занимаюсь разработкой игры в Котлине. Моя цель состоит в том, чтобы каждый раз, когда пользователь нажимал определенную кнопку, он добавлял 20 монет к своим существующим монетам. После этого номер монеты следует сохранить с общими настройками.

Общие настройки:

val sharedPreferences = getSharedPreferences("SP_INFO", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
var coins = preferenceFile.getInt("COINS", 0)

Вот схема текстового представления, в которой отображается номер монеты:

//Coin Label
<TextView android:id="@+id/coinlabel"
          android:layout_width="150dp"
          android:layout_height="60dp"

          android:textSize="40sp"
          android:textColor="@color/coinlabel"
          android:textAlignment="textStart"

          android:layout_marginTop="20dp"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintEnd_toEndOf="parent"
          />

Я пытался добавить 20 монет к существующим монетам, но это не сработало так, как я хотел.

var coins = Int

button.setOnClickListener {

        coins = 20 + coins  //The plus symbol may be used wrong here
        editor.putInt("COINS",coins)
        editor.apply()  //Here I want to save the coins number to shared-preferences
        coinlabel.setText(Integer.toString(coins))

        println(coins)
    }

Весь класс:

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import kotlinx.android.synthetic.main.activity_main.*
import android.animation.ObjectAnimator
import android.animation.AnimatorSet
import android.content.Intent
import android.net.Uri
import android.view.MotionEvent
import android.content.Context
import android.media.MediaPlayer


class MainActivity : AppCompatActivity() {


val sharedPreferences = getSharedPreferences("SP_INFO", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
var coins = sharedPreferences.getInt("COINS", 0)

var pressed: Boolean? = false
var audioon = true


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    supportActionBar?.hide()
    this.getWindow()
        .setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)


  soundon.setOnClickListener{

        audioon = false

        editor.putBoolean("AUDIOON", audioon)
        editor.apply()
     }

    soundoff.setOnClickListener {

        audioon = true

        editor.putBoolean("AUDIOON", audioon)
        editor.apply()
    }

  button.setOnClickListener {

        coins += 20
        coinlabel.setText(Integer.toString(coins))
        editor.putInt("COINS",coins)
        editor.apply()
        println(coins)
    }
   }
  }

1 Ответ

1 голос
/ 10 октября 2019

Вы не можете инициализировать эти параметры, которые зависят от контекста, вне функций жизненного цикла Activity, поскольку контекст не полностью доступен при первом создании экземпляра класса Activity:

val sharedPreferences = getSharedPreferences("SP_INFO", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
var coins = sharedPreferences.getInt("COINS", 0)

Вместо этого вы можете сделать ихvar lateinit и создайте их экземпляр в onCreate, например:

lateinit var sharedPreferences: SharedPreferences
lateinit var editor: SharedPreferences.Editor
var coins = 0

//...

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    sharedPreferences = getSharedPreferences("SP_INFO", Context.MODE_PRIVATE)
    editor = sharedPreferences.edit()
    coins = sharedPreferences.getInt("COINS", 0)
    //...
}
...