You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:55:39