在共享首选项中保存按钮的颜色 (kotlin)

Save color of a button in shared preferences (kotlin)

我喜欢在共享首选项中保存按钮的颜色。

<Button
    android:id="@+id/farbe1"
    android:layout_width="20dp"
    android:layout_height="60dp"
    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()
}

我想像保存编辑文本一样保存按钮的颜色,但不太清楚如何调整颜色代码。

您需要将颜色作为 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

不是问题的真正答案,只是作为提示 - 如果您制作一个地图将 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),但这取决于你是否值得 - 我猜这不会经常触发