使用共享首选项更改后记住 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)
// ...
}
我正在创建一个歌集应用程序,我希望能够放大和缩小歌曲的歌词。我添加了缩放功能,但我希望应用程序能够记住用户离开应用程序之前歌词的文本大小。我尝试使用共享首选项,但它不起作用。
这是我到目前为止尝试过的方法
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)
// ...
}