0

所以我正在尝试扩展基Application类并添加成员变量来创建全局变量,就像下面链接的第一个解决方案一样。

安卓全局变量

如果成员变量是简单的数据类型,如 aString或 a ,则此方法有效Boolean。但是对于更复杂的数据类型,你会怎么做呢?在我的情况下,我希望成员变量是 type HashMap<String, Boolean>

我在onActivityResult()(一个布尔值、一个String和一个HashMap<String, Boolean>)中设置了三个成员变量,并且我试图在onClick()一个按钮的方法中访问这些成员变量onClickListener。当我访问字符串和布尔变量时,它们的值被适当地设置。但是,当我访问该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;
  }
}

以下是我的 MessengeronActivityResult()中的方法。在中,我设置了 MyApp 类的私有成员变量。在方法中,我调用访问器方法。onClick()ActivityonActivityResult()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);

  }
});
4

1 回答 1

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. 所以我评论了这条线,所有的作品都按预期工作。

于 2012-06-07T08:02:25.040 回答