.setChecked () не устанавливает состояние переключателя - PullRequest
0 голосов
/ 21 апреля 2020

Я создаю часть настроек безопасности в своем приложении.

Есть 3 переключателя, которые позволяют пользователю выбирать между паролем, TouchID или ничем. Все переключатели по умолчанию отключены. При нажатии переключателя (например, для использования пароля) код проверяет, установил ли пользователь пароль. Если пользователь этого не сделал, отображается диалоговое окно, а переключатель остается не отмеченным. Затем пользователь переходит и устанавливает пароль (кнопка setUpPasscode).

После настройки действие пароля закрывается с возвращаемым регистром '2', и необходимо проверить переключатель с параметром пароля. Это не однако. Когда я перезапускаю приложение, кнопка проверяется. Как-то не проверяется сразу после завершения предыдущего действия, но технически проверяется. Что я делаю не так?

public class SecuritySettings extends AppCompatActivity
{
    TextView goBackToSettings;
    Button setUpPasscode;
    Button setUpTouchID;
    RadioButton usePasscodeSelection;
    RadioButton useTouchIDSelection;
    RadioButton useNeitherSelection;
    SharedPreferences sharedPreferences;
    SharedPreferences.Editor editor;
    Dialog myDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.security_settings);

        goBackToSettings = (TextView) findViewById(R.id.closeSettingsButtonID);
        setUpPasscode = (Button) findViewById(R.id.setUpPasscodeButtonID);
        setUpTouchID = (Button) findViewById(R.id.setUpTouchIDButtonID);
        usePasscodeSelection = (RadioButton) findViewById(R.id.usePasscode);
        useTouchIDSelection = (RadioButton) findViewById(R.id.useTouchID);
        useNeitherSelection = (RadioButton) findViewById(R.id.useNothing);

        myDialog = new Dialog(this);

        //load state of radio buttons
        loadRadioButtons();

        // go back to main settings page
        goBackToSettings.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent goBackToMainSettings = new Intent(getApplicationContext(), AppSettings.class);
                goBackToMainSettings.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(goBackToMainSettings);
                finish();
            }
        });

        //Open new activity for setting passcode
        setUpPasscode.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                Intent setUpPasscodeActivity = new Intent(getApplicationContext(), SetupPasscode.class);
                startActivityForResult(setUpPasscodeActivity, 2);
            }
        });

        // Open new activity for setting up TouchID
        setUpTouchID.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                Intent setupTouchIDActivity = new Intent(getApplicationContext(), SetupTouchID.class);
                startActivityForResult(setupTouchIDActivity, 1);
            }
        });

        // when clicked, all other buttons become unchecked and the state of the buttons are saved
        usePasscodeSelection.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                boolean bCheckForPasscode = doesUserHavePasscode();

                // If true, user has a passcode setup
                if (bCheckForPasscode)
                {
                    usePasscodeSelection.setChecked(true);
                    useTouchIDSelection.setChecked(false);
                    useNeitherSelection.setChecked(false);
                    saveRadioButtons();
                }
                else
                {
                    //No passcode detected for user

                    // Load previous radio button configuration since the selection wasn't valid
                    loadRadioButtons();
                    NoOptionSetPopup(null, "You must set up a passcode to enable this option.");
                }

            }
        });

        useTouchIDSelection.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                boolean bCheckForTouchID = doesUserHaveTouchIDSetup();

                // If true, user has TouchID setup
                if (bCheckForTouchID)
                {
                    usePasscodeSelection.setChecked(false);
                    useTouchIDSelection.setChecked(true);
                    useNeitherSelection.setChecked(false);
                    saveRadioButtons();
                }
                else
                {
                    //No passcode detected for user

                    // Load previous radio button configuration since the selection wasn't valid
                    loadRadioButtons();
                    NoOptionSetPopup(null, "You must set up TouchID to enable this option.");
                }

            }
        });

        useNeitherSelection.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                usePasscodeSelection.setChecked(false);
                useTouchIDSelection.setChecked(false);
                useNeitherSelection.setChecked(true);
                saveRadioButtons();
            }
        });

    }

    // Open sharedpreferences and get the value that was saved there after setting up passcode using the same key 'string'
    public boolean doesUserHavePasscode()
    {
        sharedPreferences = getApplicationContext().getSharedPreferences("MyPref", 0);
        String checkHashString = sharedPreferences.getString("hashed_password", null);
        if (checkHashString == null)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    // Open sharedpreferences and get the value that was saved there after setting up TouchID using the same key 'string'
    public boolean doesUserHaveTouchIDSetup()
    {
        sharedPreferences = getApplicationContext().getSharedPreferences("MyPref", 0);
        boolean bDoesUserHaveTouchIDSetup = sharedPreferences.getBoolean("doesUserHaveTouchIDSetup", false);
        return bDoesUserHaveTouchIDSetup;
    }

    public void NoOptionSetPopup(View v, String message)
    {
        TextView closePopup;
        TextView contents;
        myDialog.setContentView(R.layout.no_option_setup_popup);
        closePopup = (TextView) myDialog.findViewById(R.id.closePopupButtonID);
        contents = (TextView) myDialog.findViewById(R.id.theMessageID);
        contents.setText(message);

        closePopup.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                //Close popup
                myDialog.dismiss();
            }
        });

        myDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        myDialog.show();
    }

    // Callback method to get the boolean from SetupPasscode/SetupTouchID activity & override the method
    // What is being done here is that after a passcode/TouchID has been setup, we automatically assume that the newly set-up authentication will want to be used by the user.
    // The values being returned from the activities only happen when they're successfully done (passed all validation checks).
    // We then automatically make the corresponding radio button selected (if passcode setup, then select the 'use passcode on startup' radio button)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        switch(requestCode)
        {
            // Case for returning from SetupPasscode class
            case 2:
                // fetch the boolean value
                boolean isDone = data.getBooleanExtra("isDone", false);

                usePasscodeSelection.setChecked(isDone);
                useTouchIDSelection.setChecked(false);
                useNeitherSelection.setChecked(false);
                saveRadioButtons();
                loadRadioButtons();
                break;
            // Case for returning from SetupTouchID class
            case 1:
                // fetch the boolean value
                boolean isTouchIDSetup = data.getBooleanExtra("isTouchIDDone", false);


                usePasscodeSelection.setChecked(false);
                useTouchIDSelection.setChecked(isTouchIDSetup);
                useNeitherSelection.setChecked(false);
                saveRadioButtons();
                loadRadioButtons();
                break;
            default:
                throw new IllegalStateException("Unexpected value: " + requestCode);
        }
    }

    public void saveRadioButtons()
    {
        sharedPreferences = getApplicationContext().getSharedPreferences("MyPref", 0);
        editor = sharedPreferences.edit();
        editor.putBoolean("usePasscodeOption", usePasscodeSelection.isChecked());
        editor.putBoolean("useTouchIDOption", useTouchIDSelection.isChecked());
        editor.putBoolean("useNeitherOption", useNeitherSelection.isChecked());
    }

    public void loadRadioButtons()
    {
        sharedPreferences = getApplicationContext().getSharedPreferences("MyPref", 0);
        usePasscodeSelection.setChecked(sharedPreferences.getBoolean("usePasscodeOption", false));
        useTouchIDSelection.setChecked(sharedPreferences.getBoolean("useTouchIDOption", false));
        useNeitherSelection.setChecked(sharedPreferences.getBoolean("useNeitherOption", false));
    }

}

1 Ответ

0 голосов
/ 21 апреля 2020

Я бы предложил перегрузить метод onResume и проверить состояние переключателей, так как это будет последним элементом управления, где поток покинет вашу активность.

...