活动继承上下文中静态变量的问题

HGM

我目前正在编写一个能够跟踪比分的体育应用程序。用户应该在名为“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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

创建对象时,“不能从静态上下文引用的非静态变量”

为什么会出现“无法从静态上下文引用的非静态变量”?

“不能从静态上下文中引用的非静态变量”?

java:不能从静态上下文中引用非静态变量错误

java:非静态变量,不能从静态上下文中引用

为什么会出现“非静态变量和静态上下文”错误?

Rectangle.java:35:错误:非静态变量,不能从静态上下文中引用

使用.setText在jTextArea上打印将返回错误非静态变量,无法从静态上下文中引用

错误:无法从Java的静态上下文中引用非静态变量扫描

无法从静态上下文Java引用非静态变量

非静态变量s不能从静态上下文中引用

从静态上下文引用非静态变量

非静态变量,不能从静态上下文中引用

Java设计人员为何在静态上下文中限制使用非静态变量?

非静态变量不能从静态上下文Java中引用

无法从静态上下文引用Java JTextField和非静态变量

无法从静态上下文引用非静态变量文件路径

从上下文中获取活动?

Java语言| 错误:无法从静态上下文引用非静态变量扫描

非静态变量,无法在实例化新对象时从静态上下文问题中引用

从静态上下文引用非静态变量

特定上下文中的继承与组合

不能从静态上下文中引用非静态变量?

不能从静态上下文中引用非静态变量 [JAVA]

错误:无法从静态上下文中引用非静态变量 super >> 但我使用了 static 关键字

Java Blackjack 程序创建错误:不能从静态上下文中引用非静态变量

Shiny 上下文中 ggplotly 的问题

非静态变量 this 不能从静态上下文中引用 Dormitory dormitory = new Dormitory();

如何从非活动的静态上下文中引用“getSharedPreferences”