我目前正在编写一个能够跟踪比分的体育应用程序。用户应该在名为“ChooseSport”的活动中选择一项运动,因为我计划包含针对不同运动的特定功能。在他选择之后,他被引导到一个他应该指定团队名称的活动,最后他可以通过在每次目标发生时提交用户输入来更改分数的活动。根据他在第一个活动中的选择,随后的两个活动都需要不同。但它们应该还是有很多相似之处的。
因此,我决定按以下方式设置所有内容:“ChooseSport”开始意图打开包含与运动相关的团队名称的 EditTexts 的活动,例如“FootballActivity”、“HandballActivity”、“WaterpoloActivity”。所有这些活动都继承自更通用的类“SportActivity”。包含得分线的第三个活动的处理方式类似:“FootballScoreActivity”、“HandballScoreActivity”和“WaterpoloScoreActivity”等活动都继承自更通用的类“ScoreActivity”。如果您在“ChooseSport”中选择“football”,那么您应该会在之后被定向到“FootballActivity”和“FootballScoreActivity”。因此,根据运动的选择,不仅从“ChooseSport”到第二个活动的意图,而且从第二个活动到第三个活动的意图也会发生变化。我尝试使用“SportActivity”中的静态变量来实现此行为:
public class SportActivity extends AppCompatActivity {
public static String titleToolbar;
static ScoreActivity scoreActivityInstance;
...
Intent intent = new Intent(this, streamActivityInstance.getClass());
...
startActivity(intent);
}
public class FootballActivity extends SportActivity {
static {
titleToolbar = "Football";
scoreActivityInstance = new FootballScoreActivity();
}
}
(我.getClass()
在一个实例上而不是.class
在类上使用,因为我还没有找到一种方法来根据“ChooseSport”中的决定在 SportActivity 中引用正确的类。)
起初这似乎工作正常,但经过一些测试后,我发现了一个严重的错误:
如果我从 ChooseSport 打开一个 FootballScore,返回按两次后退按钮,打开一个 HandballScore,再次返回,然后再次打开一个 FootballScore,我最终得到一个 HandballScore!我怀疑会发生以下事情:当启动第一个 FootballActivity 时,超类 SportActivity 中的静态变量被覆盖,因为 FootballActivity 实际上已初始化。启动第一个 HandballActivity,SportActivity 的静态变量再次被覆盖,因为 HandballActivity 实际上是被初始化的。然而,第二次启动 FootballActivity 似乎不会覆盖静态超类变量,因为再次启动 HandballScore,因此显然超类变量仍处于“手球模式”。我认为这可能是因为已经有一个 FootballActivity 的实例,所以 android 不会再次实例化 FootballActivity 导致超类的静态变量不会改变。这个问题对我来说似乎很困难,因为 android 正在实例化 FootballActivity 和 HandballActivity 自己,我不完全了解 android 是如何做到这一点的。为了修复我试图调用的错误finish()
后startActivity(intent)
在SportActivity。我预计活动会被销毁,因为finish()
应该触发对onDestroy()
. 尽管如此,这并没有修复错误,进一步阅读我发现finish()
只会导致onDestroy()
被调用,但不一定会导致活动被销毁(请参阅此处的勾选评论)。
所以我会非常感谢任何提示如何修复我的错误,特别是:
1.) 你同意我的一般方法有道理吗?
2.) 即使是这样,你能想出一种不会导致这种困难的方法吗?
3.) 你同意我的假设为什么会出现错误吗?
4.) 我能做些什么来修复这个错误?
感谢您提出任何善意的建议。
Activity
创建an 时,会按特定顺序调用特定事件。请参阅:活动生命周期
您的static
字段分配有static
初始化程序,该初始化程序在类加载器首次加载类时运行。因此,如果您选择 a FootballScore
,然后是 a HandballScore
,然后又是 a FootballScore
,则前 2 次类已加载,并完成赋值,但第三次,类已加载,因此未完成任何赋值。
这样的初始化应该在Activity
生命周期事件中完成,例如“当前活动”应该在onResume()
事件处理程序中分配。
还要记住,这些类可以随时卸载,因此静态字段也可能丢失其值。
有永久存储选项,如配置文件、系统属性等,用于持久数据存储。
public class SportActivity extends AppCompatActivity {
protected String titleToolbar;
@Overriden
public void onCreate(Bundle context) {
...
}
}
public class FootballActivity extends SportActivity {
@Overriden
public void onCreate(Bundle context) {
titleToolbar = "Football";
super.onCreate(context);
...
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句