Android: checkbox.isChecked () всегда возвращает ложное условие - PullRequest
0 голосов
/ 08 октября 2011

Я пытаюсь кодировать флажок на экране справки, который по сути представляет собой всплывающее окно (действие, которое запускается основной программой), содержащее ScrollView с текстом справки, кнопку ОК и флажок, который запрашиваетесли вы хотите, чтобы экран справки появлялся автоматически при запуске программы.Все отображается правильно на экране, и флажок переключается при касании.Однако, когда нажата OK, и я проверяю состояние флажка с помощью .isChecked (), я всегда получаю ложное значение.Я уверен, что это что-то простое, что я пропустил.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» всегда разрывается на «ложь»'ответвление независимо от того, отображает ли флажок зеленый флажок или нет при нажатии кнопки OK.

Заранее спасибо.

Редактировать (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 ]

3 голосов
/ 08 октября 2011

Почему вы вызываете setContentView во второй раз? После того, как вы вызовете его второй раз, ваш флажок будет сброшен (состояние по умолчанию), а затем вы немедленно проверяете его состояние, чтобы установить флаг.

Непонятно, что вы собираетесь делать, надувая helpdialog.xml дважды, один раз в диалоге и один раз в основной активности. Звучит так, как будто вы хотите использовать диалоговую тему и вызывать setContentView () только один раз в onCreate. Это должно вести себя как ожидалось после этого.

1 голос
/ 10 октября 2011

Я наконец-то понял это, и, парень, я поступил неправильно.Пройдитесь по кривой обучения.

Мне нужно было сохранить состояние флажка.Мне нужно было использовать SharedPreferences для этого.Мне нужно было определить, когда флажок был затронут, с помощью прослушивателя, а затем сохранить настройки в это время.Открыв окно справки, я загружаю состояние предпочтения и устанавливаю флажок в это состояние, чтобы оно правильно отображалось в зависимости от предыдущего параметра пользователя.

Наконец, загрузите предпочтение в onCreate в главном действии и вызовитеshowHelpBox (), если предпочтение было установлено таким образом.

В onCreate основного действия:

    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();
        }
    });

Надеюсь, другие могут извлечь уроки из моих глупых ошибок и недоразумений.

...