安卓开发:披萨应用Intent跨Activity传值与getIntent()代码放置位置
1. 发送数据的Intent代码放置位置
你当前代码里所有传值逻辑都不需要改动已有的RadioGroup、CheckBox的监听器,也不需要修改按钮的点击触发逻辑,直接替换你原来写的空openActivity2()方法即可——因为这个方法本身就是点跳转按钮时的执行入口,此时用户的所有单选、复选框选择都已经存在控件对象的状态里,统一在这个方法内读取、打包到Intent里是最合理的位置。
注意:不要把Intent传值代码写到RadioGroup的
onCheckedChanged、CheckBox的onClick监听器里,否则会在用户每次点单选、勾选配料的时候就触发跳转,逻辑完全错误。
你原来写的所有单选按钮、复选框点击时弹Toast的逻辑完全不需要删除,保留即可——这些控件的选中状态是自身维护的,不管你有没有设置点击监听器,后续调用isChecked()、getCheckedRadioButtonId()都能准确读到用户的最终选择。
替换后的openActivity2()方法代码如下,直接放在原类里对应方法的位置即可:
public void openActivity2(){ // 1. 收集单选按钮对应的披萨尺寸选择 String pizzaSize = "未选择尺寸"; int checkedSizeId = g1.getCheckedRadioButtonId(); if (checkedSizeId == R.id.rb1) { pizzaSize = "Small"; } else if (checkedSizeId == R.id.rb2) { pizzaSize = "Medium"; } else if (checkedSizeId == R.id.rb3) { pizzaSize = "Large"; } // 2. 收集复选框对应的配料选择 StringBuilder toppings = new StringBuilder(); if (cb1.isChecked()) toppings.append("Pepperoni "); if (cb2.isChecked()) toppings.append("Olive "); if (cb3.isChecked()) toppings.append("Mushroom "); if (cb4.isChecked()) toppings.append("Extra Cheese "); if (cb5.isChecked()) toppings.append("Chicken "); if (cb6.isChecked()) toppings.append("Green Pepper "); if (toppings.length() == 0) toppings.append("未选配料"); // 3. 创建Intent,把收集到的数据以键值对形式打包 Intent intent = new Intent(this, Activity2.class); intent.putExtra("PIZZA_SIZE", pizzaSize); intent.putExtra("SELECTED_TOPPINGS", toppings.toString().trim()); // 4. 启动第二个Activity startActivity(intent); }
2. 接收数据的getIntent()代码放置位置
getIntent()方法只需要写在Activity2的onCreate()方法内部,在你已经通过findViewById()拿到total这个TextView控件之后就可以调用,不需要放在按钮的点击事件里,也不需要等其他控件初始化完成。
实际修改示例如下,你可以在Activity2的onCreate方法里,紧跟原有控件初始化的位置加入接收逻辑,后续在点提交按钮拼接total的文本时,把收到的披萨选择内容和用户填写的联系信息拼在一起展示即可:
public class Activity2 extends AppCompatActivity { EditText editName, editPhone, editEmail, editAddress; TextView total; Button buttonSubmit; // 提前定义变量存接收来的传值 String receivedSize, receivedToppings; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_2); // 以下保留你原有的所有控件初始化代码,无需修改 editName = (EditText) findViewById(R.id.editName); editPhone = (EditText) findViewById(R.id.editPhone); editEmail = (EditText) findViewById(R.id.editEmail); editAddress = (EditText) findViewById(R.id.editAddress); total = (TextView) findViewById(R.id.total); buttonSubmit = (Button) findViewById(R.id.button2); // 紧跟在控件初始化完成后,直接调用getIntent接收传值,位置就在这里 Intent receiveIntent = getIntent(); receivedSize = receiveIntent.getStringExtra("PIZZA_SIZE"); receivedToppings = receiveIntent.getStringExtra("SELECTED_TOPPINGS"); buttonSubmit.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ String name = editName.getText().toString(); String phone = editPhone.getText().toString(); String email = editEmail.getText().toString(); String address = editAddress.getText().toString(); // 将接收到的披萨选择和用户填写的信息一起拼接展示 total.setText("尺寸:\t" + receivedSize + "\n配料:\t" + receivedToppings + "\nName:\t" + name + "\nPhone:\t" + phone + "\nEmail:\t" + email + "\nAddress:\t" + address); } }); } }
内容的提问来源于stack exchange,提问作者Jtpok

