Android 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

