2014-06-09 86 views
0

我有以下代碼。爲什麼我無法將ArrayList設置爲靜態?

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<Integer> 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); 

任何幫助,將不勝感激,如果你可以添加,將修復它的代碼,將是巨大的。謝謝,

+0

是否有任何特別的理由讓這個arrayList靜態? –

+0

@android_Muncher Yah,我需要在onClickListener中使用arrayList中的值。 –

回答

1

因爲你的語法錯了。

你不能在一個方法static裏面創建一個變量會有什麼用?靜態意味着該字段與類相關,因此您可以在沒有任何參考的情況下訪問它(ClassName.staticField)。

方法內部的變量與方法有關,所以你不能在外面訪問它們,所以在這裏如何使用靜態?

您確定不會與final混淆?這在這裏是有效的。


要解決你的問題,你只需要做出static ArrayList<Integer> aScores作爲類的領域,所以你可以在你的代碼的任何地方訪問它。然後編輯您的onCreate方法本

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

這樣就節省裏面aScores領域的數組列表。

+0

如果我使用final,我仍然能夠改變arrayList中的值使用aScores.set(position,newScore )? –

+0

Ehm,即使靜態是合法的'.set'仍然是可能的。你想要的是與可變和不可變的集合。解決你的問題:ArrayList aScores = Collections.unmodifiableList(getIntent()。getIntegerArrayListExtra(「scores」));'所以你把'ArrayList'包裝在一個不可修改的列表中,所以'set'方法(等等)你使用的例外。 –

+0

但我希望能夠修改列表,這就是爲什麼我不想讓它成爲最終結果。我需要是靜態的,所以我可以在代碼中稍後使用的for循環中使用它,並且在for循環中有.set .set。對不起,我很新。 –

1

這是因爲getIntent()是一個非靜態方法,不應該引用靜態字段。

解決方案:

刪除你的ArrayList是靜態的。

+0

我需要它是靜態的,有沒有什麼辦法可以合法地使它成爲靜態的? –

+0

@MostafaSaadat爲什麼靜態?任何原因?? –

+0

我以後需要在for循環中使用它,並且我想不出有任何其他的方式。我無法完成它,因爲我希望能夠使用.set –

0

靜態方法只創建一次,因此您不能引用getIntent(),因爲Java不知道您引用的方法的哪個實例。

有關靜態方法如何工作的更多信息,請查看here

相關問題