CheckBox.setChecked () вызывает сбой; Переменная CheckBox не инициализируется, всегда null? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть диалог, который содержит несколько флажков. Когда диалоговое окно создано, поля должны быть инициализированы как отмеченные / не отмеченные в соответствии с состоянием назначенных логических переменных. Проверка переменных проходит нормально, но когда я использую CheckBox.setChecked (true / false), приложение вылетает.

После небольшого исследования и игры я заметил, что переменная Widget, которую я использую, чтобы указать на флажок, не инициализируется, хотя я понятия не имею, почему. Я связываю его с соответствующим идентификатором, но он, похоже, не прилипает. Даже пошагово просматривая код, сразу после моего вызова findViewbyId () переменная отображается как ноль. Понятия не имею почему.

(хотя есть 5 флажков, я собираюсь показать код только для одного, поскольку все они функционально идентичны)

MatrixActionActivity.java

public class MatrixActionActivity extends AppCompatActivity {
...
    private CheckBox mHotSimCheck, mPublicCheck, mNoiseCheck, mDiffGridCheck, mSilentCheck;
...
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_actions);

        mHotSimCheck = (CheckBox)findViewById(R.id.checkbox_hotsim); // <-- mHotSimCheck registers as null even after this statement

        //This button opens preferences dialog
        mPrefsButt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MatrixActionActivity.this);
                LayoutInflater inflater = MatrixActionActivity.this.getLayoutInflater();
                final View dialogView = inflater.inflate(R.layout.dialog_matrix_action_modifiers, null);
                dialogBuilder.setView(dialogView);


                final MyDeck deck = MyDeck.getInstance();
                if(deck.isDiveDPActive) {
                    Toast.makeText(MatrixActionActivity.this, "deck.isDiveDPActive = true.", Toast.LENGTH_SHORT).show(); // <-- shows fine when next statement is removed
                    mHotSimCheck.setChecked(true); // <-- Causes crash
                }else{
                    mHotSimCheck.setChecked(false);
                }

                dialogBuilder.setTitle("Dice Pool Modifier Preferences");
                dialogBuilder.setPositiveButton("Done", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        //nada
                    }
                });
                dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        //nada
                    }
                });
                AlertDialog b = dialogBuilder.create();
                b.show();
            }
        });

dialog_matrix_action_modifiers.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
...
    <CheckBox
        android:id="@+id/checkbox_hotsim"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checked="false"
        android:text="+2 while in hot sim"
        android:onClick="onCheckboxClicked"/>

</LinearLayout>
...

Ответы [ 2 ]

1 голос
/ 14 мая 2019

это null, потому что xml в вашем setContentView равно activity_actions и xml, который содержит флажок, равен dialog_matrix_action_modifiers.xml , поэтому, очевидно, он будет нулевым для вашегоcheckbox

после создания диалогового окна

mHotSimCheck = (CheckBox) dialogView.findViewById(R.id.checkbox_hotsim);

не забудьте удалить эту строку после setcontentview

mHotSimCheck = (CheckBox)findViewById(R.id.checkbox_hotsim);

NB

где вы создали свою переменную mPrefsButt?

0 голосов
/ 14 мая 2019

Флажок не содержится в xml действия, поэтому findViewById() возвращает ноль.
Вы должны инициализировать CheckBox внутри onClick() после создания dialogView:

mHotSimCheck = (CheckBox) dialogView.findViewById(R.id.checkbox_hotsim);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...