0

したがって、基本Applicationクラスを拡張し、メンバー変数を追加して、以下のリンクのこの最初のソリューションのようにグローバル変数を作成しようとしています。

Androidグローバル変数

これは、メンバー変数がaStringや。のような単純なデータ型である場合に機能しBooleanます。しかし、より複雑なデータ型に対してどのようにそれを行いますか?私の場合、メンバー変数をタイプにしたいと思います HashMap<String, Boolean>

3つのメンバー変数onActivityResult()(ブール値、a String、および)を設定しており、ボタンのメソッドでHashMap<String, Boolean>これらのメンバー変数にアクセスしようとしています。文字列変数とブール変数にアクセスすると、それらの値が適切に設定されます。ただし、変数にアクセスすると、その値は「{}」、つまり空に設定されます。複雑なデータ型で発生する必要がある種類はありますか?onClick()onClickListenerHashMap<String, Boolean>HashMapSerialization

また、メンバー変数としてを追加しました。メソッドで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;
  }
}

以下はメソッドonActivityResult()onClick()私のメッセンジャーActivityです。で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);

  }
});
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 に答える