在共享首选项中保存按钮的颜色(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 -&gt; EditText 映射(这样您就不会继续运行 findViewById),但是否值得由您决定 - 我猜这不会经常触发

【讨论】:

以上是关于在共享首选项中保存按钮的颜色(kotlin)的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮时在共享首选项中保存时间戳

共享首选项中的单选按钮和微调器?

共享首选项保存和检索数据

保存的首选项在重新启动时不起作用

如何将字符串从共享首选项转换为 MutableList<LatLng> 对以在 kotlin 中绘制折线?

共享首选项不适用于 ListView 中的联系人