(我知道final
无法更改。但如果您阅读我输入的示例,您就可以理解为什么我会问这个问题!)
我正在阅读示例hello world Android应用程序:
MainActivity.java
public final static String EXTRA_MESSAGE = "com.example.helloworld.MESSAGE";
....
....
intent.putExtra(EXTRA_MESSAGE, message);
它是如何工作的?我们是否将消息值存储在EXTRA_MESSAGE中?
此外,我可以存储多少SharedPreferences存储数据?假设我的应用程序需要存储级别和高分,我该怎么做?
public final static String HIGH_SCORE = "com.example.helloworld.HIGH_SCORE";
public final static String LEVELS = "com.example.helloworld.LEVELS";
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();
如何更改上述行以保存级别和分数?
答案 0 :(得分:3)
如有疑问,请查看docs:
static修饰符与final修饰符结合使用,也用于定义常量。最终修饰符表示此字段的值不能更改。
这里定义了什么:
public final static String EXTRA_MESSAGE = "com.example.helloworld.MESSAGE";
是一个常量,意味着保持这样,否则,你可以看到这里出现的错误:
intent.putExtra(EXTRA_MESSAGE, message);
如果要更改Extra_MESSAGE
,那么将其先前值作为键的Entry
可能会“丢失”(无法访问,更确切地说,因为您没有在某处保存该值其他人)。
为了保存更多信息,您需要更多地图键。这意味着您在此处正确定义了字段:
public final static String HIGH_SCORE = "com.example.helloworld.HIGH_SCORE";
public final static String LEVELS = "com.example.helloworld.LEVELS";
可用于将这些值存储在给定的映射中,或者用于将它们用作标识符的任何位置(基于键值结构)。这里的概念是你必须定义一个可通过游戏访问的常量,以便能够存储和检索数据。
答案 1 :(得分:0)
否则您无法在分配后更改该值。这就是为什么它被称为 final 。您可以根据需要拥有许多首选项,因为它们只是文件。
intent.putExtra(EXTRA_MESSAGE, message);
想一下地图。这只是一种关键价值关系。 EXTRA_MESSAGE是键,消息是值。
要放,你做 -
preferences.edit().putString("name", "adam");
要获得,您可以使用您使用的密钥 -
preferences.getString("name", "none");
教程和参考资料:
答案 2 :(得分:0)
你的问题与原来的问题太不一样了。这是因为你只是误解了它。
MainActivity.java
public final static String EXTRA_MESSAGE = "com.example.helloworld.MESSAGE";
....
....
intent.putExtra(EXTRA_MESSAGE, message);
这段代码并不意味着 EXTRA_MESSAGE 现在正在存储消息。它类似于键/值对。
这意味着:
final
已修复。它永远不会改变它的价值,所以它被称为 FINAL 。
你也不能改变它。它始终被视为常量。
有关更多帮助,请参阅final (Java) on Wikipedia。
答案 3 :(得分:0)
这一行:
intent.putExtra(EXTRA_MESSAGE, message)
表示您将邮件的值存储在Intent's
密钥下的EXTRA_MESSAGE
内部地图中。它不会以任何方式改变EXTRA_MESSAGE
变量的内容。
答案 4 :(得分:0)
Intent中有一个Bundle,它包含要传递的参数。把它想象成一个映射,所以当你写
intent.putExtra(EXTRA_MESSAGE, message);
它将消息保存到EXTRA_MESSAGE命名的字段中。
所以,如果你想存储高分和级别使用:
public final static String HIGH_SCORE = "com.example.helloworld.HIGH_SCORE";
public final static String LEVELS = "com.example.helloworld.LEVELS";
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(HIGH_SCORE, newHighScore);
editor.putInt(LEVELS, level);
editor.commit();
请注意,如果再次写入HIGH_SCORE或LEVELS,它将覆盖当前值!
答案 5 :(得分:0)
正如您所说,并且您也知道这一点,我们无法正常更改final
值,但使用反射API可能会这样,请参阅此an answer to Stack Overflow question Change private static final field using Java reflection。
intent.putExtra(EXTRA_MESSAGE, message);
? 正如许多答案所说,putExtra以WAP的方式工作,其中特定的键被映射到字符串,整数等类型的特定值。因此,在这种情况下EXTRA_MESSAGE
充当密钥,而message
充当价值。
AFAIK,您可以添加的SharedPreferences数量没有限制,这取决于您,但由于SharedPreferences主要与应用程序设置相关,但并非明确要求,但我们可以选择将大型或个人应用程序数据存储到XML文件或数据库。
如何保存代码以存储特定值?
editor.putInt(getString(R.string.saved_high_score), newHighScore);
假设newHighScore是您要存储的值,您可以选择更改
getString(R.string.saved_high_score)
更像一个更具体的关键字,如级别编号,以便下次更新时,分数会自动被覆盖。