在共享首选项中保存按钮的颜色(kotlin)
Posted
技术标签:
【中文标题】在共享首选项中保存按钮的颜色(kotlin)【英文标题】:Save color of a button in shared preferences (kotlin) 【发布时间】:2021-12-26 02:36:03 【问题描述】:我喜欢在共享首选项中保存按钮的颜色。
<Button
android:id="@+id/farbe1"
android:layout_
android:layout_
android:layout_marginTop="10dp"
android:backgroundTint="@color/teal_700"
app:layout_constraintStart_toEndOf="@+id/FachMontag1"
app:layout_constraintTop_toTopOf="@+id/view5" />
按钮具有在按下时改变颜色的能力。
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_montag)
val pref = getPreferences(Context.MODE_PRIVATE)
val Fach1 = pref.getString("FACHMONTAG1", "")
val Fach2 = pref.getString("FACHMONTAG2", "")
val Fach3 = pref.getString("FACHMONTAG3", "")
val Fach4 = pref.getString("FACHMONTAG4", "")
val Fach5 = pref.getString("FACHMONTAG5", "")
val Fach6 = pref.getString("FACHMONTAG6", "")
val FachMontag1 = findViewById<EditText>(R.id.FachMontag1)
FachMontag1.setText(Fach1)
val FachMontag2 = findViewById<EditText>(R.id.FachMontag2)
FachMontag2.setText(Fach2)
val FachMontag3 = findViewById<EditText>(R.id.FachMontag3)
FachMontag3.setText(Fach3)
val FachMontag4 = findViewById<EditText>(R.id.FachMontag4)
FachMontag4.setText(Fach4)
val FachMontag5 = findViewById<EditText>(R.id.FachMontag5)
FachMontag5.setText(Fach5)
val FachMontag6 = findViewById<EditText>(R.id.FachMontag6)
FachMontag6.setText(Fach6)
val Farbe1 = findViewById<Button>(R.id.farbe1)
Farbe1.setOnClickListener
val Farbe1 = findViewById<Button>(R.id.farbe1)
number_of_clicks++
if (number_of_clicks == 1)
Farbe1.setBackgroundColor(getColor(R.color.white))
number_of_clicks + 1
else if (number_of_clicks == 2)
Farbe1.setBackgroundColor(getColor(R.color.yellow))
number_of_clicks + 1
else if (number_of_clicks == 3)
Farbe1.setBackgroundColor(getColor(R.color.green))
number_of_clicks + 1
else if (number_of_clicks == 4)
Farbe1.setBackgroundColor(getColor(R.color.red))
number_of_clicks + 1
else if (number_of_clicks == 5)
Farbe1.setBackgroundColor(getColor(R.color.blue))
number_of_clicks + 1
else if (number_of_clicks == 6)
Farbe1.setBackgroundColor(getColor(R.color.purple))
number_of_clicks + 1
else if (number_of_clicks == 7)
Farbe1.setBackgroundColor(getColor(R.color.teal_700))
number_of_clicks = 0
我有一个按钮,它还可以保存我的应用程序中的一些其他内容(编辑文本)。
fun onSave(view: android.view.View)
val pref = getPreferences(Context.MODE_PRIVATE)
val editor = pref.edit()
val FachMontag1 = findViewById<EditText>(R.id.FachMontag1)
editor.putString("FACHMONTAG1", FachMontag1.text.toString())
val FachMontag2 = findViewById<EditText>(R.id.FachMontag2)
editor.putString("FACHMONTAG2", FachMontag2.text.toString())
val FachMontag3 = findViewById<EditText>(R.id.FachMontag3)
editor.putString("FACHMONTAG3", FachMontag3.text.toString())
val FachMontag4 = findViewById<EditText>(R.id.FachMontag4)
editor.putString("FACHMONTAG4", FachMontag4.text.toString())
val FachMontag5 = findViewById<EditText>(R.id.FachMontag5)
editor.putString("FACHMONTAG5", FachMontag5.text.toString())
val FachMontag6 = findViewById<EditText>(R.id.FachMontag5)
editor.putString("FACHMONTAG6", FachMontag6.text.toString())
editor.commit()
我想像编辑文本一样保存按钮的颜色,但不知道如何调整颜色的代码。
【问题讨论】:
仅供参考,您在保存功能中查找R.id.FachMontag5
两次!重复会导致这类错误,很容易错过
【参考方案1】:
您需要将颜色作为 Int 值检索,以便存储它。您无法可靠地存储资源 ID Int,因为无法保证下次编译应用时该值会以相同的方式解释。
另外,我会使用颜色列表来简化您的代码。
val Farbe1 = findViewById<Button>(R.id.farbe1)
val colors = listOf(
R.color.white,
R.color.yellow,
R.color.green,
//etc.
).map(::getColor)
Farbe1.setBackgroundColor(pref.getInt(“FARBE1”, colors[0])
Farbe1.setOnClickListener view ->
number_of_clicks++
setBackgroundColor(colors[number_of_clicks % colors.length])
//...
val Farbe1 = findViewById<Button>(R.id.farbe1)
editor.putInt("FARBE1", (Farbe1.getBackgroundDrawable() as ColorDrawable).getColor())
但是,存储实际颜色将无法使其从颜色列表中的同一位置恢复。您可能只想存储颜色列表中的索引。例如:
editor.putInt("FARBE1", number_of_clicks)
我建议您使用视图绑定,这样您就不必到处使用findViewById
。
【讨论】:
是的,您实际上并没有尝试存储颜色,而是按顺序存储位置(称为numberOfClicks
,但该名称不准确,因为当您单击足够多时它会重置为零)。每个位置所代表的实际颜色更多的是 UI 细节
是的,它应该重命名为farbe1ColorIndex
。【参考方案2】:
这不是问题的真正答案,只是作为一个提示 - 如果您制作一个将 FACHMONTAG
键与 R.id.FachMontag
ID 关联的地图,您可以制作一些小功能来处理整个“使用此键拉取数据”并将它设置在这个视图``东西上。因为它在地图中,你可以遍历所有条目来保存或加载数据
val keysToIds = mapOf
"FACHMONTAG1" to R.id.FachMontag1,
"FACHMONTAG2" to R.id.FachMontag2,
"FACHMONTAG3" to R.id.FachMontag3,
"FACHMONTAG4" to R.id.FachMontag4,
"FACHMONTAG5" to R.id.FachMontag5,
"FACHMONTAG1" to R.id.FachMontag6
fun loadEditTextData(prefs: SharedPreferences)
keysToIds.forEach key, id ->
val data = prefs.getString(key, "")
findViewById<EditText>(id).setText(data)
fun saveEditTextData(prefs: SharedPreferences)
keysToIds.forEach key, id ->
val data = findViewById<EditText>(id).text.toString()
prefs.putString(key, data)
这样你就可以通过传入一个实例来加载或保存到首选项。
您还可以查找所有这些视图一次(或使用视图绑定)并生成一个 key -> EditText
映射(这样您就不会继续运行 findViewById
),但是否值得由您决定 - 我猜这不会经常触发
【讨论】:
以上是关于在共享首选项中保存按钮的颜色(kotlin)的主要内容,如果未能解决你的问题,请参考以下文章