我是Kotlin的新手。我需要一个我无法理解java和kotlin的帮助。
对于Java,我做到了。但是对于kotlin,我做不到问题是,我创建了一个Global kotlin类公共类Global:Application((
在MainFest上,我宣布android:name=".Global">
在全局类I中声明了一个变量:
public class Global : Application() {
open var homeAPIResponse: String = "defaultValue"
}
当我为这个全局变量设置任何值时,它都不会保存,当我获取值时,总是显示默认值。我无法理解kotlin中的java类型getter和setter方法。请帮帮我。
我试过了:
global = Global()
global.homeAPIResponse = "2nd Text"
Log.d("testingTag", "Testing modified response >>>> " + global.homeAPIResponse)
在日志中,它总是显示默认值。
=========================================================================伙计们,我的目的是在全球范围内保存一些价值,在将一项活动转移到另一项活动后,这些价值不会被抹去。
请帮我举一个恰当的例子,因为我搜索了很多关于堆栈溢出的内容。却拿不到。
提前感谢
也许可以这样尝试:
public class Global : Application() {
companion object {
@JvmField
var homeAPIResponse: String = "defaultValue"
}
}
在其他活动中:
Global.homeAPIResponse = "new value"
您似乎正在手动创建Global()
应用程序;你不应该这么做。
当您的应用程序启动时,会自动创建一个Application
类。
你想把它作为一个全局变量吗?按照建议回答:
companion object {
var globalVariable = "initial value"
}
把它放在Global()
类中。不要手动创建新的Global()
实例。相反,在您的活动中,只需调用Global.globalVariable = "your new value"
此外,您还可以将其设置为kotlin所称的"顶级变量"。在全局类声明之上声明它,如下所示:
var yourGlobalVariable = "default text"
class Global : Application () {
// etc.
这可以在任何地方使用。开始在您的应用程序中键入它(没有Global
,只有它自己(,它就会导入。
编辑
如果您的目的是在活动之间保留一个全局变量,那么使用类(甚至是应用程序类(确实是不可取的。
你考虑过SharedPreferences
吗?
使用
PreferenceManager.getDefaultSharedPreferences(context).getString("key to access with", "default value")
并使用存储
PreferenceManager.getDefaultSharedPreferences(context).edit().putString("key to access with", "your new value").apply()
你知道吗?你可以在一个简单的kt文件中创建你的全局变量,如下所示:
var homeAPIResponse = "defaultValue"
有了这个,你可以在任何地方更新它,就像这样:
homeAPIResponse = "2nd Text"
希望它能帮助你
您也可以这样做。
const val homeAPIResponse: String = "defaultValue"
当你想使用它时,只需在任何地方键入homeAPIResponse
常量是编译时常量。这意味着它们的值必须在编译时分配,不像vals那样可以在运行时分配。
这意味着,const永远不能分配给函数或任何类构造函数,而只能分配给String或基元。
为此,我在Kotlin中使用以下选项:
- 观察者模式
- Singleton对象
观察者模式可能需要更多的时间来实现,但最终您将从中受益。有很多灵活性,任何人都可以订阅数据,并且类可以注入新数据。一个很好的例子是:https://www.youtube.com/watch?v=5WIS-GydJmw&t=620s观察者的最大优势是通知程序可以立即处理传入的数据,例如放在屏幕上。
另一种选择是生成一个对象而不是一个类,这相当于一个单例。我喜欢将其用于数据库,在对象内部我将使用lateinit-var,因此只有在使用时才会创建对象。当数据只在少数地方使用时,不要使用singleton。
这里的例子:
object SqlData {
init {
}
public lateinit var sql_item: SqlItem
public lateinit var sql_alamat: SqlAlamat
public lateinit var sql_floor_table: SqlFloorTable
访问单例的代码:
override fun getItemCount(): Int {
return SqlData.sql_floor_table.getSize()
}