我有一些很好的Java背景,但我对Android很新,并且已经坚持了几个小时。我已经浏览了我能找到的处理类似问题的所有其他StackOverflow文章,但似乎没有什么对我有用。我确定我已经编写了这个笨拙的程序,我的错误就像愚蠢一样,所以请撕开我的代码:)
无论如何,在我的活动上按“返回”后,我遇到了保存复选框的问题。该活动有一个各种电子邮件地址的复选框列表,您可以通过ArrayAdapter和simple_list_item_multiple_choice布局进行设置。我可以点击复选框没问题;他们很容易添加或删除复选标记。我也可以将它保存到首选项而没有任何问题(至少我认为它确实如此)。
然而,当我按下“返回”(据我所知它会破坏活动),然后重新点击调用startActivity(intent)列表活动的按钮(根据我的理解,它再次调用onCreate),我之前选择的复选框只是拒绝保存并且都未选中。我尝试了比我可以计算的更多变化,尝试使用bundleInstance和onDestroy / onCreate等,但无济于事。我的理论是问题可能是我的for循环中的代码没有设置我想要设置的复选框。是这种情况,如果是这样,我该如何解决?
(作为旁注,我知道for循环看起来很尴尬,但我这样做是因为我希望它能够响应动态列表。有时列表会有localNewsEmail和internationalNewsEmail,有时候它们都没有,有时它会有额外的。所以我需要复选框来响应动态列表,当我不确切知道哪些复选框将存在而哪些不存在。但是为了测试目的,我已经硬编码了哪些项目到添加到allEmails,如果检测到任何其他内容,则记录错误。)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_secondary_emails);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Intent intent = getIntent();
localNewsEmail = intent.getStringExtra("emailLocal");
internationalNewsEmail = intent.getStringExtra("emailInt");
listViewEmails = (ListView) findViewById(R.id.listViewEmails);
allEmails.add(localNewsEmail);
allEmails.add(internationalNewsEmail);
SharedPreferences myPrefs = this.getSharedPreferences("myPrefs", MODE_PRIVATE);
final SharedPreferences.Editor prefsEditor = myPrefs.edit();
adapter2 = new ArrayAdapter(this, android.R.layout.simple_list_item_multiple_choice, allEmails);
listViewEmails.setAdapter(adapter2);
for (int i = 0; i < listViewEmails.getChildCount(); i++) {
if ((listViewEmails.getItemAtPosition(i)).equals(localNewsEmail)) {
((CheckedTextView) listViewEmails.getChildAt(i)).setChecked(myPrefs.getBoolean(localNewsEmail, false));
} else if ((listViewEmails.getItemAtPosition(i)).equals(internationalNewsEmail)) {
((CheckedTextView) listViewEmails.getChildAt(i)).setChecked(myPrefs.getBoolean(internationalNewsEmail, false));
} else {
Log.e("SecondaryActivity", "ERROR");
((CheckedTextView) listViewEmails.getChildAt(i)).setChecked(false);
}
}
listViewEmails.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// change the checkbox state
CheckedTextView checkedTextView = ((CheckedTextView) view);
checkedTextView.setChecked(!checkedTextView.isChecked());
if (checkedTextView.getText().equals(localNewsEmail)) {
isLocalChecked = checkedTextView.isChecked();
prefsEditor.putBoolean(localNewsEmail, isLocalChecked);
prefsEditor.commit();
} else if (checkedTextView.getText().equals(internationalNewsEmail)) {
isInternationalChecked = checkedTextView.isChecked();
prefsEditor.putBoolean(internationalNewsEmail, isInternationalChecked);
prefsEditor.commit();
}
}
});
感谢您提供的任何帮助!!