2012-04-08 50 views
0

所以我試圖擴展基類Application類並添加成員變量來創建全局變量,就像在下面的鏈接的第一個解決方案中一樣。全局變量擴展應用程序類

Android global variable

此工作,如果成員變量是像StringBoolean簡單數據類型。但是,如何處理更復雜的數據類型呢?在我的情況下,我希望成員變量的類型爲HashMap<String, Boolean>

我設置在onActivityResult()三個成員變量(一個布爾值,一個StringHashMap<String, Boolean>),我想在一個按鈕的onClickListeneronClick()方法來訪問這些成員變量。當我訪問字符串和布爾變量時,它們的值被適當地設置。但是當我訪問HashMap<String, Boolean>變量時,它的值被設置爲'{}',一個空的HashMap。是否有某種Serialization需要使用複雜的數據類型?

我還添加了一個ArrayList<Boolean>作爲成員變量,當我在onclick()方法中訪問該變量時,它被正確設置。可能HashMaps必須設置不同。我不太確定這一點。

在下面的代碼中,我只展示了一個精簡版本,其中只包含HashMap成員變量。

這裏是我的Application

public class MyApp extends Application { 
    private HashMap<String, Boolean> selectedContacts = null; 

    public HashMap<String, Boolean> getSelectedContacts() { 
    return this.selectedContacts; 
    } 

    public void setSelectedContacts(HashMap<String, Boolean> sc) { 
    this.selectedContacts = sc; 
    } 
} 

子類下面是我的使者Activity方法onActivityResult()onClick()。在onActivityResult()中,我設置了MyApp類的私有成員變量。在onClick()方法中,我調用訪問器方法。

public void onActivityResult(int reqCode, int resultCode, Intent data) { 
    super.onActivityResult(reqCode, resultCode, data); 

    switch (reqCode) { 
    case R.integer.contact_manager: 

     if (resultCode == RESULT_CANCELED) 
     Log.d(getString(R.string.debug_tag), "FAILURE"); 
     if (resultCode == RESULT_OK) { 
     Log.d(getString(R.string.debug_tag), "SUCCESS"); 

     MyApp appState = ((MyApp)getApplication()); 

     appState.setSelectedContacts((HashMap<String, Boolean>) data.getSerializableExtra("selectedContacts")); 
     } 

     break; 
    } 
} 


add_contact_button.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 

    Intent i = new Intent(Messenger.this, ContactManager.class); 

    MyApp appState = ((MyApp)getApplication()); 
    HashMap<String, Boolean> sc = appState.getSelectedContacts(); 

    if (sc != null) { 
     int totalContacts = sc.size(); 
     if(totalContacts > 0) { 
     Bundle bundle = new Bundle(); 
     bundle.putSerializable("selectedContacts",sc); 
     i.putExtras(bundle); 
     } 
    } 
    startActivityForResult(i, R.integer.contact_manager); 

    } 
}); 

回答

0

所以我解決了這個問題。在onActivityResult()方法,我是通過HashMap像這樣的迭代:

Iterator<Entry<String, Boolean>> it = sc.entrySet().iterator(); 
while (it.hasNext()) { 
    HashMap.Entry pairs = (HashMap.Entry) it.next(); 
    String contactId = pairs.getKey().toString(); 
    boolean selected = (Boolean) pairs.getValue(); 
    if (selected) { 
    selectedContactsText += getName(contactId) + ", "; 
    Log.d("Messenger", getName(contactId) + " was selected"); 
    Log.d("Messenger", selectedContactsText + " is the text"); 
    } 
    it.remove(); // avoids a ConcurrentModificationException 
} 

但是我注意到while循環的最後一條語句實際上除去了HashMap元素。所以我評論了這一行,並按照預期進行了所有工作。