为什么 sharedPreference 不保存数据?

时间:2021-05-01 19:03:57

标签: android android-emulator sharedpreferences android-debug

下面的代码与我的 DatePicker 方法有关,您可以选择一个日期,TextView 显示选择的日期,如图 https://i.stack.imgur.com/cco6D.png

当我保存日期并返回到刚刚保存日期的 Letter 时,它会继续显示 DatePicker,使之前的输入变得多余,基本上每次都要求一个新的输入,而不是保存之前的输入。

>

我注意到它可能来自我的 DatePickerDialog(this, this, year, month, day).show() ,因为它在每次用户输入字母时显示,我必须将它放入什么才能阻止它在每次用户输入字母时显示?

有人知道它为什么会这样做吗?

activity_layout.xml 代码

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/btn_timePicker"
    android:text="What's the date?"/>


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/textTime"
    android:layout_marginTop="20dp"
    android:textColor="#000000"
    android:textSize="22sp"
    android:textStyle="bold"
    tools:text="@tools:sample/date/ddmmyy"/> 

主要活动代码

class NewsActivity : AppCompatActivity(), AnkoLogger, DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener {



    var letter = NewsItemModel()
    lateinit var app : MainApp
    var edit = false
    val IMAGE_REQUEST = 1

    /* https://www.youtube.com/watch?v=GmmyCOpIutA&ab_channel=CodePalace */
    var day = 0
    var month = 0
    var year = 0
    var hour = 0
    var minute = 0

    var savedDay = 0
    var savedMonth = 0
    var savedYear = 0
    var savedHour = 0
    var savedMinute = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_letter)
        app = application as MainApp

        loadData()


        btn_timePicker.setOnClickListener {
            saveData()
            Log.d("ClickListener", "just got clicked")
        }

        ratingBar.rating = 2.5f
        ratingBar.stepSize = .5f

        pickDate()

        val dropDownList = arrayOf("Latest", "Coronavirus Updates", "Crime", "Traffic and Travel", "Business", "Politics", "Weather", "Education", "Health")

        val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, dropDownList)
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_item)
        statusFilter.adapter = adapter
        statusFilter.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{

            override fun onNothingSelected(parent: AdapterView<*>?) {
            }



            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                if(statusFilter.selectedItemPosition == 1){
                    condition1()
                }
                if(statusFilter.selectedItemPosition == 2){
                    condition2()
                }
                if(statusFilter.selectedItemPosition == 3){
                    condition3()
                }
                if(statusFilter.selectedItemPosition == 4){
                    condition4()
                }
                if(statusFilter.selectedItemPosition == 5){
                    condition5()
                }
                if(statusFilter.selectedItemPosition == 6){
                    condition6()
                }
                if(statusFilter.selectedItemPosition == 7){
                    condition7()
                }
                if(statusFilter.selectedItemPosition == 8){
                    condition8()
                }
                if(statusFilter.selectedItemPosition == 9){
                    condition9()
                }
            }

            private fun condition1(){
                Toast.makeText(getApplicationContext(), "selected Item: " + statusFilter.selectedItem, Toast.LENGTH_LONG).show()
            }
            private fun condition2(){
                Toast.makeText(getApplicationContext(), "selected Item: " + statusFilter.selectedItem, Toast.LENGTH_LONG).show()
            }
            private fun condition3(){
                Toast.makeText(getApplicationContext(), "selected Item: " + statusFilter.selectedItem, Toast.LENGTH_LONG).show()
            }
            private fun condition4(){
                Toast.makeText(getApplicationContext(), "selected Item: " + statusFilter.selectedItem, Toast.LENGTH_LONG).show()
            }
            private fun condition5(){
                Toast.makeText(getApplicationContext(), "selected Item: " + statusFilter.selectedItem, Toast.LENGTH_LONG).show()
            }
            private fun condition6(){
                Toast.makeText(getApplicationContext(), "selected Item: " + statusFilter.selectedItem, Toast.LENGTH_LONG).show()
            }
            private fun condition7(){
                Toast.makeText(getApplicationContext(), "selected Item: " + statusFilter.selectedItem, Toast.LENGTH_LONG).show()
            }
            private fun condition8(){
                Toast.makeText(getApplicationContext(), "selected Item: " + statusFilter.selectedItem, Toast.LENGTH_LONG).show()
            }
            private fun condition9(){
                Toast.makeText(getApplicationContext(), "selected Item: " + statusFilter.selectedItem, Toast.LENGTH_LONG).show()
            }
        }

        val submission = findViewById<Button>(R.id.submit_button)

        submission.setOnClickListener {
            Toast.makeText(this, "Button is clicked", Toast.LENGTH_LONG)
        }


        ratingBar.setOnRatingBarChangeListener { ratingBar, rating, fromUser ->
            Toast.makeText(this, "Rating: $rating", Toast.LENGTH_SHORT).show()
        }




        LetterLocation.setOnClickListener {
            startActivity(intentFor<MapsActivity>())
        }

        chooseImage.setOnClickListener {
            showImagePicker(this, IMAGE_REQUEST)
        }

        if (intent.hasExtra("NewsLetter_edit")) {
            edit = true
            letterImage.setImageBitmap(readImageFromPath(this, letter.image))
            if (letter.image != null) {
                chooseImage.setText(R.string.change_letter_image)
            }
            letter = intent.extras?.getParcelable<NewsItemModel>("NewsLetter_edit")!!
            letterTitle.setText(letter.title)
            letterDescription.setText(letter.description)
            letterAuthor.setText(letter.author)
            letterImage.setImageBitmap(readImageFromPath(this, letter.image))
            btnAdd.setText(R.string.save_letter)
        }

        btnAdd.setOnClickListener() {
            letter.title = letterTitle.text.toString()
            letter.description = letterDescription.text.toString()
            letter.author = letterAuthor.text.toString()
            if (letter.title.isEmpty()) {
                toast(R.string.enter_letter_title)
            } else {
                if (edit) {
                    app.letters.update(letter.copy())
                } else {
                    app.letters.create(letter.copy())
                }
            }
            info("add Button Pressed: $letterTitle")
            setResult(AppCompatActivity.RESULT_OK)
            finish()
        }

        toolbarAdd.title = title
        setSupportActionBar(toolbarAdd)
    }

   private fun saveData() {
        val insertedText = btn_timePicker.text.toString()
        val key1 = "STRING_KEY"
        val key2 = "BOOLEAN_KEY"

        textTime.text = insertedText
        val sharedPreferences = getSharedPreferences("sharedPrefs", Context.MODE_PRIVATE) ?: return

            with(sharedPreferences.edit()) {
                putString(key1, insertedText)
                apply()
            }
            Toast.makeText(this@NewsActivity, "Data Saved", Toast.LENGTH_SHORT).show()
        }


fun onClick(v: View?) {
        (activity as NewsActivity).onDateSet(textTime)
    } 


    private fun loadData() {
        val sharedPreferences  = getSharedPreferences("sharedPrefs", Context.MODE_PRIVATE)
        val savedString = sharedPreferences.getString("STRING_KEY", null)

        textTime.text = savedString
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_letter, menu)
        if (edit && menu != null) menu.getItem(0).setVisible(true)
        return super.onCreateOptionsMenu(menu)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item?.itemId) {
            R.id.item_delete -> {
                app.letters.delete(letter)
                finish()
            }
            R.id.item_cancel -> {
                finish()
            }
        }
        return super.onOptionsItemSelected(item)
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            IMAGE_REQUEST -> {
                if (data != null) {
                    letter.image = data.getData().toString()
                    letterImage.setImageBitmap(readImage(this, resultCode, data))
                    chooseImage.setText(R.string.change_letter_image)
                }
            }
        }
    }


    private fun getDateTimeCalendar(){
        val cal = Calendar.getInstance()
        day = cal.get(Calendar.DAY_OF_MONTH)
        month = cal.get(Calendar.MONTH)
        year = cal.get(Calendar.YEAR)
        hour = cal.get(Calendar.HOUR)
        minute = cal.get(Calendar.MINUTE)
    }

       private fun pickDate() {
       if (textTime != null) {
           getDateTimeCalendar()
           DatePickerDialog(this, this, year, month, day).show()
       }
    }


    override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
        savedDay = dayOfMonth
        savedMonth = month
        savedYear = year

        getDateTimeCalendar()
        TimePickerDialog(this, this, hour, minute, true).show()
    }

    override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {
        savedHour = hourOfDay
        savedMinute = minute

        textTime.text = "\n $savedDay-$savedMonth-$savedYear\n Hour: $savedHour Minute: $savedMinute"
    }
}

1 个答案:

答案 0 :(得分:0)

请尝试使用 commit() 代替 apply()。

apply() 函数立即更改内存中的 SharedPreferences 对象,但将更新异步写入磁盘。或者,您可以使用 commit() 将数据同步写入磁盘。但是由于 commit() 是同步的,您应该避免从主线程调用它,因为它可能会暂停您的 UI 渲染。

with(sharedPreferences.edit()) {
            putString(key1, insertedText)
            commit()
        }
相关问题