【问题标题】:Why can't I make the ArrayList static?为什么我不能将 ArrayList 设为静态?
【发布时间】:2014-06-09 22:43:06
【问题描述】:

我有以下代码。

public class Start extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start);

    ArrayList<String> aPlayerList = getIntent().getStringArrayListExtra("playerList");
    static ArrayList<Integer> aScores = getIntent().getIntegerArrayListExtra("scores");
...

尝试将 ArrayList&lt;Integer&gt; aScores 设为静态时出现错误:Non-static method getIntent() cannot be referenced from a static context,我不知道如何解决此问题。

如果有帮助,这就是意图的传递方式:

            Bundle bund = new Bundle();
            bund.putStringArrayList("playerList", playerList);
            bund.putIntegerArrayList("scores", scores);

            Intent intent = new Intent(Players.this, Start.class);
            intent.putExtras(bund);
            startActivity(intent);

任何帮助将不胜感激,如果您可以添加可以修复它的代码,那就太好了。谢谢,

【问题讨论】:

  • 保持这个arrayList静态有什么特别的原因吗?
  • @android_Muncher 是的,我需要在 onClickListener 中使用 arrayList 中的值。

标签: android android-intent arraylist static


【解决方案1】:

因为你的语法是错误的。

您不能在方法static 中创建变量,这有什么用?静态意味着该字段与类相关,因此您无需任何引用即可访问它 (ClassName.staticField)。

方法内部的变量是和方法相关的,所以你不能在外部访问它们,所以这里怎么能使用静态?

你确定你不会对final 感到困惑吗?此处有效。


要解决您的问题,您只需将static ArrayList&lt;Integer&gt; aScores 作为类的字段,以便您可以在代码中的任何位置访问它。然后将您的onCreate 方法编辑为此

aScores = getIntent().getIntegerArrayListExtra("scores");

所以它会将数组列表保存在aScores 字段中。

【讨论】:

  • 如果我使用 final,我仍然可以使用 aScores.set(position, newScore) 更改 arrayList 中的值吗?
  • 嗯,即使静态是合法的 .set 仍然是可能的。您想要的与可变和不可变集合有关。要解决您的问题,请执行以下操作:ArrayList&lt;Integer&gt; aScores = Collections.unmodifiableList(getIntent().getIntegerArrayListExtra("scores")); 所以您将ArrayList 包装在一个不可修改的列表中,这样set 方法(等)如果使用会抛出异常。
  • 但是我希望能够修改列表,这就是为什么我不想让它成为最终的。我需要是静态的,所以我可以在稍后在代码中使用的 for 循环中使用它,并且我在 for 循环中有 .set 。抱歉,我是新手。
  • 那么你需要设置静态是的,但是如果你想让它在任何地方都可以访问,那么你需要一个静态字段。所以在类外创建一个字段并将引用保存在这里。 (警告,如果您不小心,这种方法会给您带来更多错误。)将public static ArrayList&lt;Integer&gt; aScores 放在类外和onCreate 方法内,只需aScores = ...
  • 在方法之外*作为类的字段。
【解决方案2】:

那是因为getIntent() 是一个非静态方法,不应引用静态字段。

解决方案:

删除你的arrayList的静态。

【讨论】:

  • 我需要它是静态的,有什么方法可以合法地使其成为静态?
  • @MostafaSaadat 为什么是静态的?有什么原因吗??
  • 我以后需要在for循环中使用它,我想不出任何其他的方法。我无法将其定为最终版本,因为我希望能够使用 .set 更改数组列表中的值
  • @MostafaSaadat 循环位于 Start 类中的什么位置?
  • @MostafaSaadat 然后将您的 ArrayList aScores 作为全局变量
【解决方案3】:

静态方法只创建一次,因此您不能引用 getIntent(),因为 Java 不知道您引用的是哪个方法实例。

查看here 了解有关静态方法如何工作的更多信息。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2010-10-20
    • 2020-01-08
    • 2011-01-23
    • 2012-12-30
    • 2013-11-17
    • 2021-12-31
    • 2010-09-19
    相关资源
    最近更新 更多