2012-04-08 6 views
0

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

Android global variable

メンバ変数がStringまたはBooleanなどの単純なデータ型である場合、これは動作します。しかし、より複雑なデータ型のためにはどうしたらいいですか?私の場合、メンバー変数はHashMap<String, Boolean>であることが望ましいです。

私は3つのメンバーonActivityResult()の変数(ブール、String、およびHashMap<String, Boolean>)を設定しています、と私はボタンのonClickListeneronClick()方法でこれらのメンバ変数にアクセスしようとしています。文字列とブール変数にアクセスすると、その値は適切に設定されます。しかし、私がHashMap<String, Boolean>変数にアクセスすると、その値は '{}'に設定され、空の場合はHashMapとなります。複雑なデータ型で発生する必要があるSerializationの種類がありますか?

また、ArrayList<Boolean>をメンバー変数として追加しました。onclick()メソッドでこの変数にアクセスしたとき、正しく設定されました。おそらくHashMapsを別に設定する必要があります。私はこの点があまりにも確実ではない。

以下のコードでは、メンバー変数であるHashMapのみを含む、削除されたバージョンを示しています。ここで

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

この問題を修正しました。私は、whileループの最後の文が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 
} 

onActivityResult()方法では、私はそうのようなHashMapを反復処理されました。だから私はこのラインをコメントし、意図した通りにすべての作品。