当前位置: 首页 > 知识库问答 >
问题:

静态编程语言中使用共享偏好检索值

顾鸣
2023-03-14

我试图在kotlin中的两个活动之间传递一个值,但如果我使用下面的代码,那么我只得到“Hello World”默认值,而不是PREFERENCE_NAME值。我的文本ID名称是android: id="@id/tv_count"感谢任何帮助。

Main Activity:
import android.content.Context
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

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

        val mypreference=MyPreference(this)
        var loginCount=mypreference.getLoginName()
        mypreference.setLoginName(loginCount)
        tv_count.text=loginCount.toString()
    }
}

My Preference:
import android.content.Context

class MyPreference(context:Context)
{

    val PREFERENCE_NAME="SharedPreferenceExample"
    val preference=context.getSharedPreferences(PREFERENCE_NAME,Context.MODE_PRIVATE)

    fun getLoginName():String
    {
        return preference.getString(PREFERENCE_NAME,"Hello World")
    }

    fun setLoginName(name:String)
    {
        val editor=preference.edit()
        editor.putString(PREFERENCE_NAME,name)
    }
}

共有3个答案

郑翰海
2023-03-14

由于Kotlin中的委托属性,这将是一个更广泛的答案,展示了非常优雅地使用首选项的一般方法。这些使我们能够为日常用品提供自己的后备商店。

考虑这个描述如何读取和写入布尔值的类:

class BooleanPrefStore(val default: Boolean = false) {
  operator fun getValue(thisRef: ContextWrapper?, property: KProperty<*>): Boolean =
    PreferenceManager.getDefaultSharedPreferences(thisRef)
      .getBoolean(property.name, default)

  operator fun setValue(thisRef: ContextWrapper?, property: KProperty<*>, value: Boolean) {
    PreferenceManager.getDefaultSharedPreferences(thisRef)
      .edit()
      .putBoolean(property.name, value)
      .apply()
  }
}

一个getter和setter,使用通常的方式从首选项读写。有了这个类,我们可以非常简洁优雅地设置属性:

var Property1: Boolean by BooleanPrefStore()
var Property2: Boolean by BooleanPrefStore(true)

它甚至允许我们提供一个默认值,如果它不同于“默认默认值”的话。如果需要的话,只需以同样的方式创建其他助手类即可,< code>IntPrefStore 、< code>LongPrefStore或< code>StringPrefStore。然后,您只需使用这些属性或给它们赋值,所有这些都将自动存储到首选项存储中,并从首选项存储中检索。

只有一个警告:首选项存储需要访问当前上下文。如果在保存上下文的活动片段或类似的Android类中声明这些属性,则无需执行其他操作。所有这些类都实现了ContextWrapper。但是如果您需要自己的类中的属性,您需要自己将其制作成一个<code>上下文包装器</code>例如:

class MyClass private constructor(context: Context) : ContextWrapper(context) {
  ...

只要在实例化时提供上下文即可。

赵驰
2023-03-14

您需要调用< code>commit,即

fun setLoginName(name:String)
{
    val editor=preference.edit()
    editor.putString(PREFERENCE_NAME,name)
    editor.commit()
}
经清野
2023-03-14

在您的情况下,您没有使用编辑器。commit()函数。这是全部代码

//Store in SharedPreference  
 val preference=getSharedPreferences(resources.getString(R.string.app_name), Context.MODE_PRIVATE)
    val editor=preference.edit()
    editor.putBoolean("isLoggedIn",true)
    editor.putInt("id",1)
    editor.putString("name","Alex")
    editor.commit()


//Retrieve from SharedPreference

    val name= preference.getString("name","")
    val id= preference.getInt("id",0)
    val isLoggedIn= preference.getBoolean("isLoggedIn",false)
 类似资料:
  • 我试图在Kotlin中创建一些功能测试,以使用Rest-Assured库向Cart Java服务发出请求。 因为我希望测试按程序进行,所以我希望能够存储第一个API请求的结果,并将其传递给下一个单元测试。 即 createCartTest()-- 从来没有真正使用过静态编程语言,所以寻找测试所有APIendpoint的最佳方法的建议。 还是在同一个函数中发出另一个请求并将结果传递给下一步更好? 跨

  • 我有一个这样的旋转器: 当用户点击时,我希望它保存状态: 它将位置保存在SharedPref中,但微调器将返回默认值。有人看到什么了吗?

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。

  • 经过大量研究,我最终决定在这里发布以下问题。对于大学项目,我想通过SharedReferences保存我的应用程序设置。然而,无论我做什么,它都不起作用。 对于一个简单的测试,我尝试在我的主要活动的oncreate方法中编写一些testdata,如下所示: 当我在调试模式下检查prefs对象时,它会向我显示应该创建文件的路径:/data/user/0//共享优先/测试。xml 然而,当我在手机上导