首页 > 解决方案 > 单选按钮在 Android 中返回错误的值

问题描述

我有一个表格,一个人可以在其中输入朋友的详细信息(姓名、年龄、性别、地址)。该朋友显示在列表视图中,当单击列表中的朋友时,他们可以选择编辑该记录。

我可以成功更新除性别之外的朋友的所有细节。

例如:

列表显示:

1) James Bond, 20, Male, Sydney NSW

然后我单击编辑并将其更改为

James smith, 21, Female, Canberra NSW

然后回到我的列表视图中,它将显示:

1) James smith, 21, Male, Canberra NSW

注意性别如何没有改变?

我可以弄清楚为什么会发生这种情况,因为我使用与更改性别相同的逻辑来更改姓名和年龄

以下是相关代码:

ViewFriend.java(此类显示列表视图并具有编辑选项)

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

上面的代码从数据库中检索详细信息并将其传递给意图。我已经打印了每个变量的内容(姓名、年龄、性别、地址)并且它们打印正确。

editFriend.java(这个类预先用通过正确显示的意图传递的数据填充表单)

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

这就是问题所在,即使用户点击男性,它也会注册为女性,我不确定为什么。

有什么想法可以解决这个问题吗?

标签: javaandroid

解决方案


您的问题是您将rb变量的值设置为单个单选按钮,在此处使用先前的性别值预定义

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

然后你读取同一个按钮的值。要解决此问题,请单击侦听器以获取更新按钮,您需要使用getCheckedRadioButtonId单选组(您的rg变量)读取选中的单选按钮 ID。

upd:这就是你的编辑朋友活动代码的样子

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

推荐阅读