使用共享首选项更改后记住 TextView 大小

Remember TextView size after changing it with Shared Preferences

我正在创建一个歌集应用程序,我希望能够放大和缩小歌曲的歌词。我添加了缩放功能,但我希望应用程序能够记住用户离开应用程序之前歌词的文本大小。我尝试使用共享首选项,但它不起作用。

这是我到目前为止尝试过的方法

class Cantare : AppCompatActivity() {

    lateinit var tvSizePrefs: SharedPreferences
    lateinit var tvSizeEditor: SharedPreferences.Editor
    var mTextSize: Float = 50f

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

        tvSizePrefs = getSharedPreferences("TextSizePref", Context.MODE_PRIVATE)
        tvSizeEditor = tvSizePrefs.edit()

        setSupportActionBar(findViewById(R.id.toolbar2))
        supportActionBar?.setDisplayShowTitleEnabled(false)

        val songTitle = findViewById<TextView>(R.id.songTitle)
        val songString = findViewById<TextView>(R.id.songString)

        songString.textSize = tvSizePrefs.getFloat("TextSize", 50f)

    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_song, menu)


        return super.onCreateOptionsMenu(menu)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {

        val id: Int = item.itemId

        when(id) {
            R.id.zoomOut -> {
                mTextSize -= 2f
                songString.setTextSize(TypedValue.COMPLEX_UNIT_PX, (mTextSize))
                tvSizeEditor.putFloat("TextSize", mTextSize)
                tvSizeEditor.apply()
                Toast.makeText(this, songString.textSize.toString(), Toast.LENGTH_SHORT).show()
            }
            R.id.zoomIn -> {
                mTextSize += 2f
                songString.setTextSize(TypedValue.COMPLEX_UNIT_PX, (mTextSize))
                tvSizeEditor.putFloat("TextSize", mTextSize)
                tvSizeEditor.apply()
                Toast.makeText(this, songString.textSize.toString(), Toast.LENGTH_SHORT).show()
            }
        }

        return super.onOptionsItemSelected(item)
    }

}

我发现您的代码有两个问题。
第一个是 mTextSize 总是用 50f 初始化,并且您没有根据保存的文本大小值设置它的值。仅在 onCreate 内设置文本视图的大小。所以 mTextSize 总是从 50f 开始,当你第一次缩放 in/out 时,文本的大小会重置为 ~50f.
第二个是在 onCreate 中设置文本视图大小时没有传递复杂单位。
我认为将您的代码更改为类似这样的内容可以解决您的问题:

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    // replace songString.textSize = tvSizePrefs.getFloat("TextSize", 50f) with:
    mTextSize = tvSizePrefs.getFloat("TextSize", 50f)
    text.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize)
    // ...
}