Android开发:如何创建选项依赖首个Spinner的二级Spinner?
实现Spinner联动:根据第一个选项动态更新第二个Spinner的内容
没问题,我来帮你搞定这个联动Spinner的需求。核心逻辑就是给第一个部门Spinner添加选中事件监听,根据用户选择的部门,动态切换第二个Spinner的数据源。下面是具体的实现步骤和修改后的代码:
第一步:更新strings.xml,添加对应部门的项目数组
首先我们需要为每个部门单独定义对应的项目数组,替换你原来的programme_array:
<string-array name="department_array"> <item>Civil</item> <item>CSE/IT</item> <item>Electronics</item> </string-array> <!-- 各部门对应的项目数组 --> <string-array name="civil_prog_array"> <item>B.Tech Civil</item> </string-array> <string-array name="cse_it_prog_array"> <item>BCA</item> <item>MCA</item> </string-array> <string-array name="electronics_prog_array"> <item>B.Tech Electronics</item> <item>Diploma Electronics</item> </string-array>
第二步:修改RegisterActivity.java代码,添加Spinner联动逻辑
我们需要给SpinDept设置OnItemSelectedListener,在选中事件触发时更新SpinProg的适配器。下面是修改后的完整代码(关键部分我标了注释):
public class RegisterActivity extends AppCompatActivity implements View.OnClickListener { private EditText TextFname; private EditText TextMname; private EditText TextLname; private Spinner SpinDept; private Spinner SpinProg; private EditText TextSemester; private EditText TextRolln; private EditText TextEmail; private EditText TextPassword; private EditText TextPasswordConfirm; private FirebaseFirestore db = FirebaseFirestore.getInstance(); private ProgressBar pBar; private View bgBlur; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); // 初始化控件 TextFname = findViewById(R.id.Fname); TextMname = findViewById(R.id.Mname); TextLname = findViewById(R.id.Lname); SpinDept = findViewById(R.id.Dept); SpinProg = findViewById(R.id.Prog); TextSemester = findViewById(R.id.Semester); TextRolln = findViewById(R.id.Rolln); TextEmail = findViewById(R.id.Email); TextPassword = findViewById(R.id.Password); TextPasswordConfirm = findViewById(R.id.PasswordConfirm); findViewById(R.id.SubmitButton).setOnClickListener(this); pBar=findViewById(R.id.indeterminateBar); bgBlur=findViewById(R.id.bgblur); // 初始化部门Spinner的适配器 ArrayAdapter<CharSequence> deptAdapter = ArrayAdapter.createFromResource(this, R.array.department_array, android.R.layout.simple_spinner_item); deptAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); SpinDept.setAdapter(deptAdapter); // 关键:给部门Spinner添加选中事件监听 SpinDept.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 根据选中的部门,加载对应的项目数组 String selectedDept = parent.getItemAtPosition(position).toString(); ArrayAdapter<CharSequence> progAdapter; switch (selectedDept) { case "Civil": progAdapter = ArrayAdapter.createFromResource(RegisterActivity.this, R.array.civil_prog_array, android.R.layout.simple_spinner_item); break; case "CSE/IT": progAdapter = ArrayAdapter.createFromResource(RegisterActivity.this, R.array.cse_it_prog_array, android.R.layout.simple_spinner_item); break; case "Electronics": progAdapter = ArrayAdapter.createFromResource(RegisterActivity.this, R.array.electronics_prog_array, android.R.layout.simple_spinner_item); break; default: // 默认情况,可以设置空数组或者提示项 progAdapter = new ArrayAdapter<>(RegisterActivity.this, android.R.layout.simple_spinner_item, new String[]{"请选择部门"}); break; } // 设置项目Spinner的下拉样式并更新适配器 progAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); SpinProg.setAdapter(progAdapter); } @Override public void onNothingSelected(AdapterView<?> parent) { // 未选中任何项时的处理(可选) } }); } // 你的Validation方法保持不变 private boolean validate() { AwesomeValidation mAwesomeValidation = new AwesomeValidation(BASIC); mAwesomeValidation.addValidation(TextFname, "\\D+", "Invalid First Name"); mAwesomeValidation.addValidation(TextLname, "\\D+", "Invalid Last Name"); mAwesomeValidation.addValidation(TextSemester, "[1-9]+[0-9]{0,}", "Invalid Semester (Cannot be less than 0)"); mAwesomeValidation.addValidation(TextRolln, "[a-zA-Z-0-9\\s]+", "Invalid Roll Number"); mAwesomeValidation.addValidation(TextEmail, Patterns.EMAIL_ADDRESS, "Invalid Email Address"); String regexPassword = "(?=.*[a-z])(?=.*[A-Z])(?=.*[\\d])(?=.*[~`!@#\\$%\\^&\\*\\(\\)\\-_\\+=\\{\\}\\[\\]\\|\\;:\\\"<>.,/\\?]).{6,}"; mAwesomeValidation.addValidation(TextPassword, regexPassword, "Use 6 or more characters with a mix of upper & lower letters, numbers & symbols"); mAwesomeValidation.addValidation(TextPasswordConfirm, TextPassword, "Password does not match"); return mAwesomeValidation.validate(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.SubmitButton: if (validate()) { String TextDept = SpinDept.getSelectedItem().toString(); String TextProg = SpinProg.getSelectedItem().toString(); pBar.setVisibility(View.VISIBLE); bgBlur.setVisibility(View.VISIBLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); String Email = getTrimmedInput(TextEmail); final CollectionReference dbUsers = db.collection("Students"); final DocumentReference dbDocs = dbUsers.document(Email); final StudentImproved studentImproved = new StudentImproved.Builder() .setFirstName(getTrimmedInput(TextFname)) .setMiddleName(getTrimmedInput(TextMname)) .setLastName(getTrimmedInput(TextLname)) .setDepartment(TextDept) .setProgramme(TextProg) .setSemester(Integer.parseInt(getTrimmedInput(TextSemester))) .setRollNumber(getTrimmedInput(TextRolln)) .setEmail(getTrimmedInput(TextEmail)) .setPassword(getTrimmedInput(TextPassword)) .build(); dbUsers.document(Email) .get() .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { @Override public void onComplete(@NonNull Task<DocumentSnapshot> task) { if (task.isSuccessful()) { if (task.getResult().exists()) { pBar.setVisibility(View.GONE); bgBlur.setVisibility(View.GONE); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); Toast.makeText(RegisterActivity.this, "You already have your data stored in the database", Toast.LENGTH_LONG).show(); } else { dbDocs.set(studentImproved) .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { pBar.setVisibility(View.GONE); bgBlur.setVisibility(View.GONE); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); Toast.makeText(RegisterActivity.this, "Successfully Registered",Toast.LENGTH_LONG).show(); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { pBar.setVisibility(View.GONE); bgBlur.setVisibility(View.GONE); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); Toast.makeText(RegisterActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); } }); } } } }); } break; } } private String getTrimmedInput(EditText text) { return text.getText().toString().trim(); } }
第三步:修改Spinner的XML代码(可选)
因为我们已经在Java代码里设置了适配器,所以可以去掉XML里的android:entries属性,避免冲突:
<Spinner android:id="@+id/Dept" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="131dp" android:layout_marginTop="24dp" android:layout_marginEnd="132dp" android:spinnerMode="dropdown" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/Rolln" /> <Spinner android:id="@+id/Prog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="179dp" android:layout_marginTop="24dp" android:layout_marginEnd="180dp" android:spinnerMode="dropdown" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/Dept" />
这样修改后,当用户选择第一个Spinner里的不同部门时,第二个Spinner就会自动切换成对应的项目列表啦。比如选CSE/IT时,第二个Spinner就会显示BCA和MCA选项。
内容的提问来源于stack exchange,提问作者user11134615
相关产品推荐
相关产品推荐

