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

Android Material Stepper最后一步无法获取表单数据求助

排查Material Stepper最后一步无法获取表单数据的问题

我正在使用Material Stepper组件实现一个包含3个表单步骤的流程,前两步能正常获取并传递表单数据,但最后一步的数据始终无法传递到主Activity中。以下是相关代码片段,麻烦帮忙排查原因:

最后一步Fragment的核心代码

public OnFragmentPassing mOnFragmentPassing; 

@Override 
public boolean onNextButtonHandler() { 
    Toast.makeText(getContext(), "test", Toast.LENGTH_SHORT).show(); 
    String dataNamaToko = txtNamaToko.getText().toString(); 
    String jenisToko = txtJenisToko.getSelectedItem().toString(); 
    String alamatToko = txtUkmAddress.getText().toString(); 
    String provinceToko = getProvinceId; 
    String cityToko = getCityId; 
    String kecamatanToko = getDistrictId; 
    String kelurahanToko = getSubDistrictId; 
    String postalCodeToko = txtUkmPostalCode.getText().toString(); 

    mOnFragmentPassing.sendUkmName(dataNamaToko); 
    mOnFragmentPassing.sendUkmType(jenisToko); 
    mOnFragmentPassing.sendUkmAddress(alamatToko); 
    mOnFragmentPassing.sendUkmAddressProvince(provinceToko); 
    mOnFragmentPassing.sendUkmAddressCity(cityToko); 
    mOnFragmentPassing.sendUkmAddressDistrict(kecamatanToko); 
    mOnFragmentPassing.sendUkmAddressSubDistrict(kelurahanToko); 
    mOnFragmentPassing.sendUkmPostalCode(postalCodeToko); 
    return true; 
} 

数据传递接口定义

public interface OnFragmentPassing { 
    void sendPersonalName(String personalName); 
    void sendDob(String dob); 
    void sendGender(String gender); 
    void sendNikData(String nik); 
    //void sendEmail(String email); 
    void sendPhone(String phoneNumber); 
    void sendAddress(String address); 
    void sendAddressProvince(String province); 
    void sendAddressCity(String city); 
    void sendAddressDistrict(String district); 
    void sendAddressSubDistrict(String subDistrict); 
    void sendAddressPostalCode(String postalCode); 

    void sendUkmName(String ukmName); 
    void sendUkmType(String ukmType); 
    void sendUkmAddress(String ukmAddress); 
    void sendUkmAddressProvince(String ukmProvince); 
    void sendUkmAddressCity(String ukmCity); 
    void sendUkmAddressDistrict(String ukmDistrict); 
    void sendUkmAddressSubDistrict(String ukmSubDistrict); 
    void sendUkmPostalCode(String ukmPostalCode); 
} 

主Activity的完成回调代码

public void onStepperCompleted() { 
    showCompletedDialog(); 
} 

protected void showCompletedDialog(){ 
    //Toast.makeText(this, "nama "+ mPersonalName + mNamaToko, Toast.LENGTH_SHORT).show(); 
    String category = "1"; 
    String photo = "http://google.com"; 
    String email = getIntent().getStringExtra("emailUkmRegistration"); 

    UkmRegistrationRequest ukmRegistrationRequest = new UkmRegistrationRequest(
        category, mPersonalName, mPersonalDob, mPersonalGender, mPersonalNik, 
        photo, email, mPersonalPhone, mPersonalAddress, mPersonalProvince, 
        mPersonalCity, mPersonalDistrict, mPersonalSubDistrict, mPersonalPostalCode, 
        mUkmName, mUkmType, mUkmAddress, mUkmProvince, mUkmCity, mUkmDistrict, 
        mUkmSubDistrict, mUkmPostalCode
    ); 

    Call<UkmRegistrationResponse> call = apiService.ukmRegistrationResponse(ukmRegistrationRequest); 
    call.enqueue(new Callback<UkmRegistrationResponse>() { 
        @Override 
        public void onResponse(Call<UkmRegistrationResponse> call, Response<UkmRegistrationResponse> response) { 
            String status = response.body().getData().getStatus(); 
            Toast.makeText(UkmRegistrationForm.this, "status : "+ status, Toast.LENGTH_SHORT).show(); 
            redirectCheckEmail(); 
        } 

        @Override 
        public void onFailure(Call<UkmRegistrationResponse> call, Throwable t) { 
            Toast.makeText(UkmRegistrationForm.this, "Failed Registration !", Toast.LENGTH_SHORT).show(); 
        } 
    }); 
} 

可能的排查方向

结合你的代码和常见的Stepper组件问题,这里列出几个需要优先检查的点:

  • 接口绑定是否完成:确认最后一步的Fragment在onAttach方法中,是否将Activity实例赋值给了mOnFragmentPassing?比如:

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        try {
            mOnFragmentPassing = (OnFragmentPassing) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement OnFragmentPassing");
        }
    }
    

    如果没有这一步,mOnFragmentPassing会是null,调用接口方法时会抛出空指针,数据根本无法传递。

  • Activity是否正确实现接口所有方法:检查主Activity是否实现了OnFragmentPassing的所有方法,尤其是sendUkmXXX系列方法,有没有把参数赋值给对应的成员变量(比如mUkmName = ukmName;)。如果漏写了某个方法的赋值逻辑,那对应的变量就会是空值。

  • 控件初始化是否正确:确认最后一步Fragment中的txtNamaToko、txtJenisToko等控件,是否在onViewCreated或onCreateView中通过findViewById或ViewBinding完成了初始化。如果控件是null,调用getText()或getSelectedItem()会抛出异常,导致onNextButtonHandler的代码执行中断,后续的接口调用也不会执行。

  • onNextButtonHandler是否被触发:点击最后一步的下一步按钮时,你加的Toast.makeText(getContext(), "test", Toast.LENGTH_SHORT).show();有没有弹出?如果没有,说明这个方法根本没被Stepper组件调用,需要检查Stepper的配置,比如最后一步是否被设置为“完成”步骤,导致按钮逻辑被替换成了完成回调。

  • 成员变量是否初始化:主Activity中的mUkmName、mUkmType等变量有没有被正确初始化(比如声明时赋值为空字符串,避免null)?如果变量是null,即使接口方法赋值了,也可能在后续使用中出现问题。

内容的提问来源于stack exchange,提问作者rafitio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:31:52