Android中传递Spinner选中值至另一页面并写入Cloud Firestore
解决跨页面传递Spinner选中值并写入Cloud Firestore的问题
方法:使用Intent传递数据(Android标准做法)
无需导入FormCadastro1类到FormCadastro2,正确的方式是通过Intent的extras传递选中的Spinner值,步骤如下:
1. 修改FormCadastro1,传递Spinner数据
在按钮点击事件中实时获取当前Spinner的选中值,并通过Intent传递到FormCadastro2:
public class FormCadastro1 extends AppCompatActivity { Spinner edit_spempr, edit_sparea, edit_spsetor, edit_spcargos; Button bt_cadastrar; Usuarios usuarios; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_form_cadastro1); getSupportActionBar().hide(); IniciarComponentes(); // 初始化Spinner适配器 ArrayAdapter adapter = ArrayAdapter.createFromResource(this, R.array.spItemCargos, android.R.layout.simple_spinner_item); edit_spcargos.setAdapter(adapter); ArrayAdapter adapter1 = ArrayAdapter.createFromResource(this, R.array.spItemEmpresa, android.R.layout.simple_spinner_item); edit_spempr.setAdapter(adapter1); ArrayAdapter adapter3 = ArrayAdapter.createFromResource(this, R.array.spItemArea, android.R.layout.simple_spinner_item); edit_sparea.setAdapter(adapter3); ArrayAdapter adapter2 = ArrayAdapter.createFromResource(this, R.array.spItemSetor, android.R.layout.simple_spinner_item); edit_spsetor.setAdapter(adapter2); usuarios = new Usuarios(); bt_cadastrar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 点击按钮时获取Spinner当前选中值 String empr = edit_spempr.getSelectedItem().toString(); String area = edit_sparea.getSelectedItem().toString(); String setor = edit_spsetor.getSelectedItem().toString(); String cargo = edit_spcargos.getSelectedItem().toString(); // 创建Intent并添加传递的数据 Intent intent = new Intent(FormCadastro1.this, FormCadastro2.class); intent.putExtra("EMPRESA", empr); intent.putExtra("AREA", area); intent.putExtra("SETOR", setor); intent.putExtra("CARGO", cargo); startActivity(intent); } }); } private void IniciarComponentes() { edit_sparea = findViewById(R.id.spArea); edit_spempr = findViewById(R.id.spEmpresa); edit_spsetor = findViewById(R.id.spSetor); edit_spcargos = findViewById(R.id.spCargos); bt_cadastrar = findViewById(R.id.btnCadastrar); } }
2. 修改FormCadastro2,接收数据并写入Firestore
在onCreate中获取Intent传递的数据,保存为成员变量,然后在SalvarDadosUsuario中使用:
public class FormCadastro2 extends AppCompatActivity{ EditText edit_nome, edit_senha, edit_email, edit_confsenha, edit_tel; Button bt_Próximo; String[] mensagens = {"Preencha todos os campos", "Cadastro realizado com sucesso"}; String UID; String ID; TextView MainActivityPasswordError, MainActivityConfirmPassError; Usuarios usuarios; FirebaseFirestore db = FirebaseFirestore.getInstance(); // 存储从FormCadastro1传递过来的数据 private String empresa, area, setor, cargo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_form_cadastro2); getSupportActionBar().hide(); IniciarComponentes(); usuarios = new Usuarios(); // 获取Intent传递的数据 Intent intent = getIntent(); empresa = intent.getStringExtra("EMPRESA"); area = intent.getStringExtra("AREA"); setor = intent.getStringExtra("SETOR"); cargo = intent.getStringExtra("CARGO"); CollectionReference reff = db.collection("Usuarios"); bt_Próximo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String nome = edit_nome.getText().toString().trim(); String email = edit_email.getText().toString().trim(); String senha = edit_senha.getText().toString().trim(); String tel = edit_tel.getText().toString().trim(); if (nome.isEmpty() || email.isEmpty() || senha.isEmpty() || tel.isEmpty()) { Snackbar snackbar = Snackbar.make(view, mensagens[0], Snackbar.LENGTH_SHORT); snackbar.setBackgroundTint(Color.WHITE); snackbar.setTextColor(Color.BLACK); snackbar.show(); } else { CadastrarUsuario(view); Intent intent = new Intent(FormCadastro2.this, FormLogin.class); startActivity(intent); } } }); } public void SalvarDadosUsuario() { String nome = edit_nome.getText().toString().trim(); String email = edit_email.getText().toString().trim(); String senha = edit_senha.getText().toString().trim(); String tel = edit_tel.getText().toString().trim(); UID = FirebaseAuth.getInstance().getCurrentUser().getUid(); Map<String, Object> usuarios = new HashMap<>(); usuarios.put("nome", nome); usuarios.put("email", email); usuarios.put("senha", senha); usuarios.put("Tel", tel); usuarios.put("empresa", empresa); usuarios.put("area", area); usuarios.put("setor", setor); usuarios.put("cargo", cargo); usuarios.put("Login", UID); usuarios.put("ID", ""); db.collection("Usuarios").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { Integer IDS = task.getResult().size(); ID = String.valueOf(IDS + 1); DocumentReference documentReference = db.collection("Usuarios").document(ID); documentReference.set(usuarios).addOnSuccessListener(aVoid -> { // 合并update操作,减少网络请求 documentReference.update("ID", ID); }); } } }); } private void IniciarComponentes() { edit_nome = findViewById(R.id.editNome); edit_email = findViewById(R.id.editEmail); edit_senha = findViewById(R.id.editSenha); edit_confsenha = findViewById(R.id.editConfSenha); edit_tel = findViewById(R.id.editTel); bt_Próximo = findViewById(R.id.btnPróximo); // 初始化缺失的TextView MainActivityPasswordError = findViewById(R.id.your_password_error_id); MainActivityConfirmPassError = findViewById(R.id.your_confirm_password_error_id); } private boolean ValidaçãoDeSenha() { String passwordInput = edit_senha.getText().toString().trim(); String ConfitmpasswordInput = edit_confsenha.getText().toString().trim(); if (passwordInput.isEmpty()) { MainActivityPasswordError.setText("Field can't be empty"); return false; } if (passwordInput.length() < 5) { MainActivityPasswordError.setText("Password must be at least 5 characters"); return false; } if (!passwordInput.equals(ConfitmpasswordInput)) { MainActivityConfirmPassError.setText("Password Would Not be matched"); return false; } else { MainActivityConfirmPassError.setText("Password Matched"); return true; } } public void CadastrarUsuario(View view) { String email = edit_email.getText().toString(); String senha = edit_senha.getText().toString(); FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, senha).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { SalvarDadosUsuario(); Snackbar snackbar = Snackbar.make(view, mensagens[1], Snackbar.LENGTH_SHORT); snackbar.setBackgroundTint(Color.WHITE); snackbar.setTextColor(Color.BLACK); snackbar.show(); } else { String erro; try { throw task.getException(); } catch (FirebaseAuthWeakPasswordException e) { erro = "Digite um senha com no mínimo 6 carácteres"; } catch (FirebaseAuthUserCollisionException e) { erro = "Esta conta já foi cadastrada"; } catch (FirebaseAuthInvalidCredentialsException e) { erro = "E-mail inválido"; } catch (Exception e) { erro = "Erro ao cadastrar usuário"; } Snackbar snackbar = Snackbar.make(view, erro, Snackbar.LENGTH_SHORT); snackbar.setBackgroundTint(Color.WHITE); snackbar.setTextColor(Color.BLACK); snackbar.show(); } } }); } }
关键修正与优化
- Spinner值获取时机:原代码在
onCreate中提前获取Spinner值,会导致获取初始默认值而非用户选择后的值,改为按钮点击时获取。 - Firestore操作合并:将
set与update操作合并,减少不必要的网络请求。 - 缺失View初始化:补充
MainActivityPasswordError和MainActivityConfirmPassError的findViewById调用,避免空指针异常。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

