简体   繁体   中英

Radio button returns wrong value in Android

I have a form where a person can enter details about a friend (name, age, gender, address). This friend is displayed in a list view and when a friend from the list is clicked on they have the choice to edit that record.

I can successfully update every detail about a friend except for the gender.

For example:

List view:

1) James Bond, 20, Male, Sydney NSW

Then I click edit and change it to

James smith, 21, Female, Canberra NSW

and then back in my list view it will show:

1) James smith, 21, Male, Canberra NSW

Notice how the gender doesn't change?

I can figure out why this is happening as I use the same logic to change the name and age as i did to change the gender

Here is the relevant code:

ViewFriend.java ( this class displays the list view and has the edit option)

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, final View view, final int position, long id) {
        String text = listView.getItemAtPosition(position).toString();
        final int ID = Integer.parseInt(String.valueOf(text.charAt(0)));
        AlertDialog.Builder builder = new AlertDialog.Builder(viewFriends.this);
        builder.setTitle("Notice");
        builder.setMessage("Please select to to edit, delete a friend or cancel");

        // add the buttons
        builder.setPositiveButton("Edit", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(getApplicationContext(), editOrDelete.class);
                ArrayList<String> result1 = mydb.retrieveRow(ID);
                name = result1.get(1);
                age = result1.get(2);
                gender = result1.get(3);
                address = result1.get(4);
                code = result1.get(0);
                intent.putExtra("code", code);
                intent.putExtra("name", name);
                intent.putExtra("age", age);
                intent.putExtra("gender", gender);
                intent.putExtra("address", address);
                startActivity(intent);
            }
        });
        builder.setNeutralButton(" Delete", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mydb.deleteTitle(ID);
                finish();
                Intent intent = new Intent(getApplicationContext(),viewFriends.class);
                startActivity(intent);
            }
        });
        builder.setNegativeButton("Cancel", null);
        AlertDialog dialog = builder.create();
        dialog.show();
    }
});

The code above retrieves the details from the database and passes it to the intent. I have printed the contents of each variable (name, age, gender, address) and they print out correctly.

editFriend.java ( this class pre fills the form with the data passed through the intent that displays correctly)

  public class editFriend extends AppCompatActivity {
    private  Intent intent;
    private RadioGroup rg;
    private Button update;
    private RadioButton rb;
    private String newName,newAddress,newGender;
    private int newAge;
    EditText ed, ed1;
    public String name,address,gender,age,code;
    private int selectedID,ages,codes;
    NumberPicker numberPicker;
    private databaseManager4 myDataBase;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_editordeletefriend);
        intent= getIntent();
        myDataBase = new databaseManager4(this);
        rg = (RadioGroup)findViewById(R.id.radioGroup_update);
        selectedID = rg.getCheckedRadioButtonId();
        rb = (RadioButton) findViewById(selectedID);
        ed = (EditText)findViewById(R.id.fullName_update);
        numberPicker = (NumberPicker)findViewById(R.id.resultAge_update);
        numberPicker.setMinValue(6);
        numberPicker.setMaxValue(110);
        numberPicker.setWrapSelectorWheel(false);
        update = (Button)findViewById(R.id.update_button);
        ed1 = (EditText)findViewById(R.id.address_update);
        name = intent.getStringExtra("name");
        age = intent.getStringExtra("age");
        gender = intent.getStringExtra("gender");
        address = intent.getStringExtra("address");
        code = intent.getStringExtra("code");
        codes = Integer.parseInt(code);
        displayForm();
        newName = ed.getText().toString();
        newAge = numberPicker.getValue();
        newGender = rb.getText().toString();


        update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              
              int id = rg.getCheckedRadioButtonId();
            rb = (RadioButton) findViewById(id);
                if (myDataBase.updateRow(codes,newName,newAge,newGender,ed1.getText().toString())){
                Toast.makeText(getApplicationContext(),"successfully updated the friend "
                           +ed.getText().toString(),Toast.LENGTH_SHORT).show();
               }
               else{
                   Toast.makeText(getApplicationContext(),"Could not  update the friend "
                           +ed.getText().toString(),Toast.LENGTH_SHORT).show();
               }
               intent = new Intent(getApplicationContext(),viewFriends.class);
               startActivity(intent);
            }
        });
    }

    public void displayForm(){
        ed.setText(name);
        ed1.setText(address);

       if (gender.equals("Male")){
            rb = (RadioButton)findViewById(R.id.resultGenderMale_update);
        }
         else if (gender.equals("Female"))
        {
            rb = (RadioButton)findViewById(R.id.resultGenderFemale_update);
        }
        rb.setChecked(true);

        ages= Integer.parseInt(age);
        numberPicker.setValue(ages);


    }
    public void clear(){
        ed.setText("");
        ed1.setText("");
    }
}

This is where the issue lies, even if the user clicks on Male it registers as female and i am unsure why.

Any ideas how i can fix this?

Your problem is that you set value of rb variable to a single radio button, predefined with previous gender value here

if (gender.equals("Male")){
  rb = (RadioButton)findViewById(R.id.resultGenderMale_update);
}
else if (gender.equals("Female"))
{
  rb = (RadioButton)findViewById(R.id.resultGenderFemale_update);
}

And you read value of the same button then. To fix that in you click listener for update button you need to read checked radio button id using getCheckedRadioButtonId on radio group (your rg variable).

upd: this is how your Edit Friend activity code might look like

public class EditFriendActivity extends AppCompatActivity {
  private RadioGroup mGenderRadioGroup;
  private Button mUpdateButton;
  private EditText mNameField;
  private EditText mAddressField;
  private NumberPicker mAgePicker;
  private databaseManager4 mDatabaseManager;

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

    mDatabaseManager = new databaseManager4(this);
  }

  private void initUI() {
    Intent intent = getIntent();
    mNameField = (EditText) findViewById(R.id.fullName_update);
    mNameField.setText(intent.getStringExtra("name"));

    mAddressField = (EditText) findViewById(R.id.address_update);
    mAddressField.setText(intent.getStringExtra("address"));

    mAgePicker = (NumberPicker) findViewById(R.id.resultAge_update);
    mAgePicker.setMinValue(6);
    mAgePicker.setMaxValue(110);
    mAgePicker.setWrapSelectorWheel(false);
    mAgePicker.setValue(Integer.parseInt(intent.getStringExtra("age")));

    mUpdateButton = (Button) findViewById(R.id.update_button);
    mUpdateButton.setOnClickListener(updateClickListener);

    mGenderRadioGroup = (RadioGroup) findViewById(R.id.radioGroup_update);

    RadioButton targetRadioButton = null;
    switch (Gender.fromString(intent.getStringExtra("gender"))) {
      case MALE:
        targetRadioButton = (RadioButton) findViewById(R.id.resultGenderMale_update);
        break;
      case FEMALE:
        targetRadioButton = (RadioButton) findViewById(R.id.resultGenderFemale_update);
        break;
    }
    if (targetRadioButton != null) {
      targetRadioButton.setChecked(true);
    }
  }

  public void clear() {
    mNameField.setText("");
    mAddressField.setText("");
  }

  private Gender getSelectedGender() {
    int checkedButtonId = mGenderRadioGroup.getCheckedRadioButtonId();
    switch (checkedButtonId) {
      case R.id.resultGenderMale_update:
        return Gender.MALE;
      case R.id.resultGenderFemale_update:
        return Gender.FEMALE;
    }
    return Gender.UNDEFINED;
  }

  private View.OnClickListener updateClickListener =
      new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          Gender newGender = getSelectedGender();
          int code = Integer.parseInt(getIntent().getStringExtra("code"));
          System.out.println("gender is" + newGender.stringValue);
          if (mDatabaseManager.updateRow(
              code,
              mNameField.getText().toString(),
              mAgePicker.getValue(),
              newGender.stringValue,
              mAddressField.getText().toString())) {
            Toast.makeText(
                    getApplicationContext(),
                    "successfully updated the friend " + ed.getText().toString(),
                    Toast.LENGTH_SHORT)
                .show();
          } else {
            Toast.makeText(
                    getApplicationContext(),
                    "Could not  update the friend " + ed.getText().toString(),
                    Toast.LENGTH_SHORT)
                .show();
          }
          Intent viewFriendsIntent = new Intent(getApplicationContext(), viewFriends.class);
          startActivity(viewFriendsIntent);
          finish();
        }
      };

  private enum Gender {
    UNDEFINED("undefined"),
    MALE("Male"),
    FEMALE("Female");

    private @Nullable String stringValue;

    Gender(@Nullable String stringValue) {
      this.stringValue = stringValue;
    }

    public static Gender fromString(@Nullable String value) {
      if (value != null) {
        for (Gender gender : Gender.values()) {
          if (value.equals(gender.stringValue)) {
            return gender;
          }
        }
      }
      return UNDEFINED;
    }
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM