从DialogFragment向ProfileFragment传值报错:setTargetFragment提示其非Fragment
问题解决:setTargetFragment提示ProfileFragment不是Fragment
核心原因
你遇到的错误本质是Fragment类的包版本不兼容:
- ProfileFragment导入的是
androidx.fragment.app.Fragment(新版AndroidX库) - 但打开对话框时调用
getActivity().getFragmentManager(),返回的是旧平台的android.app.FragmentManager,和AndroidX的Fragment类型不匹配,导致系统认为ProfileFragment不是Fragment。
另外代码里还有几个需要修正的细节问题:
分步修正代码
1. 修正ProfileFragment的对话框打开逻辑
把getActivity().getFragmentManager()替换为AndroidX兼容的FragmentManager:
// ProfileFragment中Beditemail的点击事件修改 Beditemail.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "onClick: opening email dialog"); DialogUpdateEmail dialog = new DialogUpdateEmail(); dialog.setTargetFragment(ProfileFragment.this, PROFILE_FRAGMENT); // 使用AndroidX兼容的FragmentManager dialog.show(getParentFragmentManager(), "DialogUpdateEmail"); } });
2. 修正DialogUpdateEmail的代码
- 移除不必要的
SendInputEmail接口实现(对话框是调用方,不需要实现这个接口) - 把EditText改为成员变量,避免点击事件中无法访问
- 确保mHost在onAttach中初始化,避免空指针
import androidx.fragment.app.DialogFragment; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.util.Log; public class DialogUpdateEmail extends DialogFragment { private static final String TAG = "DialogUpdateEmail"; private SendInputEmail mHost; private EditText mUpdateEmail; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.popup, container, false); mUpdateEmail = view.findViewById(R.id.emailinfoupdate); Button saveBtn = view.findViewById(R.id.updatesavebutton); Button cancelBtn = view.findViewById(R.id.updatecancelbutton); saveBtn.setOnClickListener(v -> { String input = mUpdateEmail.getText().toString(); Log.d(TAG, "input : "+input); if (mHost != null) { mHost.sendInput(input); } getDialog().dismiss(); }); cancelBtn.setOnClickListener(v -> getDialog().dismiss()); return view; } @Override public void onAttach(Context context) { super.onAttach(context); try { mHost = (SendInputEmail) getTargetFragment(); } catch (ClassCastException e) { Log.e(TAG, "onAttach: ClassCastException : " + e.getMessage()); } } }
3. 检查依赖一致性
确保所有Fragment相关的类都使用AndroidX包:
- 不要混合导入
android.app.Fragment和androidx.fragment.app.Fragment - DialogFragment必须是
androidx.fragment.app.DialogFragment
补充说明
完成以上修改后:
- 点击修改邮箱按钮会弹出对话框
- 输入新邮箱点击保存,会通过
SendInputEmail接口回调到ProfileFragment的sendInput方法 - ProfileFragment更新TextView显示,之后你可以在
sendInput方法中添加数据库更新逻辑
内容的提问来源于stack exchange,提问作者Daiana
相关产品推荐
相关产品推荐

