Android: checkbox.isChecked() всегда возвращает ложное условие
Я пытаюсь установить флажок на экране справки, который представляет собой всплывающее окно (действие, запускаемое основной программой), содержащее ScrollView с текстом справки, кнопку "ОК" и флажок, запрашивающий, хотите ли вы Экран справки автоматически появляется при запуске программы. Все отображается правильно на экране, и флажок переключается при касании. Однако, когда нажата OK, и я проверяю состояние флажка с помощью.isChecked(), я всегда получаю false. Я уверен, что это что-то простое, что я пропустил. XML-файл выглядит следующим образом:
helpdialog.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:background="#ffffff">
<ScrollView android:id="@+id/ScrollView01"
android:layout_width="wrap_content" android:layout_below="@+id/ImageView01"
android:layout_height="300px">
<TextView android:text="@+id/helpView" android:id="@+id/helpView"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textColor="#000000"/>
</ScrollView>
<Button android:id="@+id/Button01"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_centerHorizontal="true" android:text=" OK "
android:layout_below="@id/ScrollView01"/>
<CheckBox android:id="@+id/chkNoHelp" android:textColor="#000000"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Don't Display at Startup"
android:layout_below="@id/Button01" />
</RelativeLayout>
HelpBox.java:
public class HelpBox extends Activity {
CheckBox checkBox;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//set up dialog
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.helpdialog);
dialog.setTitle("Help");
dialog.setCancelable(true);
//set up text
TextView text = (TextView) dialog.findViewById(R.id.helpView);
text.setText(getString(R.string.help_text));
//set up button
Button button = (Button) dialog.findViewById(R.id.Button01);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Boolean mDisplayHelp;
setContentView(R.layout.helpdialog);
checkBox = (CheckBox) findViewById(R.id.chkNoHelp);
if (checkBox.isChecked()) {
mDisplayHelp = true;
} else {
mDisplayHelp = false;
}
finish();
}
});
//now that the dialog is set up, it's time to show it
dialog.show();
}
}
Установка точек останова в обеих строках "mDisplayHelp" всегда прерывается в ветке "ложь" независимо от того, отображает ли флажок зеленый флажок или нет при нажатии кнопки ОК.
Заранее спасибо.
Изменить (10/10):
Ясно, что я хочу сделать, это получить информацию после того, как пользователь выйдет из диалогового окна, чтобы я мог почувствовать состояние флажка и сохранить его в качестве предпочтения. Для этого я предполагаю, что я должен проверить это в onDestory. Итак, я сделал это:
@Override
public void onDestroy() {
Boolean mDisplayHelp;
setContentView(R.layout.helpdialog);
checkBox = (CheckBox) findViewById(R.id.chkNoHelp);
if (checkBox.isChecked()) {
mDisplayHelp = true;
} else {
mDisplayHelp = false;
}
}
Тем не менее, я по-прежнему всегда придумываю FALSE, независимо от того, установлен флажок или отключен. В этом случае, если я не включаю setContentView, я получаю исключение NullPointerException для isChecked.
2 ответа
Почему вы вызываете setContentView во второй раз? После того, как вы вызовете его второй раз, ваш флажок будет сброшен (состояние по умолчанию), а затем вы немедленно проверяете его состояние, чтобы установить флаг.
Непонятно, что вы хотите сделать, надувая helpdialog.xml дважды, один раз в диалоге и один раз в основной активности. Звучит так, как будто вы хотите использовать диалоговую тему здесь и вызывать setContentView() только один раз в onCreate. После этого он должен вести себя как ожидалось.
Я наконец понял это, и мальчик, я поступил неправильно. Мелом до кривой обучения.
Что мне нужно было сделать, это сохранить состояние флажка. Мне нужно было использовать SharedPreferences для этого. Мне нужно было определить, когда флажок был затронут, с помощью прослушивателя, а затем сохранить настройки в это время. Открыв окно справки, я загружаю состояние предпочтения и устанавливаю флажок в это состояние, чтобы оно отображалось правильно в соответствии с предыдущими настройками пользователя.
Наконец, загрузите предпочтение в onCreate для основного действия и вызовите showHelpBox(), если предпочтение было установлено.
По основному виду деятельности:
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
Boolean mDisplayHelp = prefs.getBoolean("checkboxPref", false);
if (mDisplayHelp == false)
showHelpBox();
В поле справки предварительно инициализируйте флажок на основе предыдущей настройки:
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
mDisplayHelp = prefs.getBoolean("checkboxPref", false);
final CheckBox ckBox = (CheckBox) dialog.findViewById(R.id.chkNoHelp);
ckBox.setChecked(mDisplayHelp);
Когда флажок коснулся:
ckBox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (ckBox.isChecked()) {
mDisplayHelp = true;
} else {
mDisplayHelp = false;
}
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("checkboxPref", mDisplayHelp);
// Don't forget to commit your edits!!!
editor.commit();
}
});
Надеюсь, другие могут извлечь уроки из моих глупых ошибок и недоразумений.