2011-04-28 75 views
0

嘿我無法聲明,更改和使用全局變量。我嘗試了整個「創建一個擴展你的應用程序並把變量放在那裏的類」的東西,但我不知道如何實現它。這是我的課程,其中的變量。在Android應用程序中遇到困難與全局變量

public class MyApp extends Application { 

    public int listPos; 

} 

然後我嘗試訪問並更改int listPos在這裏。

public class Browse extends ListActivity{ 
MyApp app = ((MyApp)getApplicationContext()); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    String[] coffeeTypes = getResources().getStringArray(R.array.coffeeTypes); 
    setListAdapter(new ArrayAdapter<String>(this, R.layout.listview, coffeeTypes)); 

    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 

    lv.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, 
     int position, long id) { 
     app.listPos = position; 
     startActivity(new Intent(Browse.this, CoffeeTypes.class)); 

    } 
    }); 
} 

}

然後我試圖訪問該變量在下面的活動來決定的,如果else語句

public class CoffeeTypes extends Activity{ 
MyApp app = ((MyApp)getApplicationContext()); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if(app.listPos == 0){ 
     Toast.makeText(this, "WEEEEEEE!0", Toast.LENGTH_LONG).show(); 
    } 
    else if(app.listPos == 1){ 
     Toast.makeText(this, "RAWR!1", Toast.LENGTH_LONG).show(); 

任何人有任何想法,我做錯了的結果?

+0

實際問題是什麼? – Haphazard 2011-04-28 01:07:11

回答

0

您可以使用索里亞的回答有一些修改。我個人仍然會使用myApp類,但將listPos更改爲靜態並以此方式訪問它。這樣做可以讓您使用Application類onCreate方法根據需要初始化值(儘管在本示例中不需要)或其他Android方法。

public class MyApp extends Application { 

    public static int listPos; 

} 

//~~ Elsewhere: 
MyApp.listPos = 5; //etc 

但這不是處理您的問題類型的最佳方法。

您應通過Intent傳遞列表位置信息(或單擊的項目的標識或您處理數據的標識)。

取代具有全局變量來跟蹤這個信息,保持局部的只是意向:

public void onItemClick(AdapterView<?> parent, View view, 
     int position, long id) { 
     //app.listPos = position; 
     Intent intent = new Intent(Browse.this, CoffeeTypes.class); 
     intent.putExtra("position", position); 
     startActivity(intent); 
     //startActivity(new Intent(Browse.this, CoffeeTypes.class)); 

    } 

這通過意圖傳遞位置數據到新的活動。在你CoffeeTypes活動你應該遵循以下的東西開始:

//in onCreate... 
int incomingPosition = getIntent().getIntExtra("position",-1)); 
if(incomingPosition != -1) { //do stuff } 

這將讀取輸入的意圖「位置」數據,因此你可以使用它。如果沒有添加任何內容,則上面的-1是默認值。

最後一個警告:您可能要小心地來回發送列表位置,具體取決於添加新項目/刪除項目時應用程序的設置方式,列表位置可能不再指向您的項目認爲它。如果這些咖啡類型/您正在使用的咖啡具有單獨的唯一ID,可能更適合避免上述情況,請考慮使用該ID。

+0

真棒幫助!儘管現在我的應用程序因某種未知的原因而崩潰,但是您的意圖是正確的。更容易。 – 2011-04-28 03:02:18

+0

@ Seeshi_suin我忘了添加現在編輯的startActivity的修改版本。雖然可能與你的新問題沒有關係。 – Dan 2011-04-28 03:28:45

0

我不確定這是否是與Android操作系統的可見性問題,你能夠做一個公共職能,可能能夠充當變量的獲取者?

我知道你可以在上下文之間傳遞變量,你可能必須這樣做。

也許臨時解決方法讓你移動可能是創建一個靜態類的可訪問變量嗎?

0

創建一類像這樣

class globalClass 
{ 
     static int lastPos; 
} 

可以使用

globalClass.lastPos = value; 

設定值,並得到功能

int myVal = globalClass.lastPos; 
0

我通過將變量設置爲private來創建應用程序變量類,然後創建public get()和set()方法來更改變量。你可以嘗試一下,但看起來好像你做得很對,在技術上

它可能會出錯的一個原因是你在onCreate而不是onStartCommand中實現的東西。如果您正在測試此功能,並且錯誤地假設/瞭解了活動週期,則可能出錯