Android 11+版本Fragment导航崩溃问题(API33编译)求助
解决方案:API33下Fragment导航崩溃问题
问题根源
Android API30及以上版本(尤其是用API33编译时)对Fragment的实例化机制执行更严格的规范:Fragment必须提供无参构造函数。系统在重建Fragment(如配置变化、进程重启)时,会通过无参构造函数实例化Fragment,带参构造会导致实例化失败直接崩溃。低版本编译时系统兼容性处理更宽松,但API33编译后强制执行该规则,这就是你遇到崩溃的核心原因。
具体修复步骤
1. 修改HelloFragment代码,添加无参构造并移除带参构造依赖
package com.XXXXXXXX.XXXXX; import android.content.Intent; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; public class HelloFragment extends Fragment { ListView lst; String[] maladie = {"Michel","Jack"}; String[] desc = {"Acheteur","Vendeur"}; Integer[] imgid = {R.drawable.michel,R.drawable.jack}; // 必须添加无参构造函数,系统重建Fragment时会调用 public HelloFragment() { // 空实现即可 } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.hello_fragment, container, false); lst = view.findViewById(R.id.listviewhello); // 直接用getActivity()获取宿主Activity,无需手动传入 CustomeListviewAdapter customeListview = new CustomeListviewAdapter(getActivity(), maladie, desc, imgid); lst.setAdapter(customeListview); lst.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { if(position == 0) { Intent intent = new Intent(getContext(), Michel.class); startActivity(intent); } else if(position == 1) { Intent intent = new Intent(getContext(), Jack.class); startActivity(intent); } } }); return view; } }
2. 修改Home类中Fragment的实例化代码
改用无参构造创建Fragment实例:
helloFragment = inflate.findViewById(R.id.home_hello); helloFragment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 使用无参构造创建Fragment HelloFragment nextFrag = new HelloFragment(); getActivity().getSupportFragmentManager() .beginTransaction() .replace(R.id.fragment_container, nextFrag, "findThisFragment") .addToBackStack(null) .commit(); } });
如果后续需要给Fragment传递参数,禁止用构造函数传参,必须用setArguments(Bundle)方式:
// 创建Fragment时传参示例 HelloFragment nextFrag = new HelloFragment(); Bundle args = new Bundle(); args.putString("param_key", "param_value"); nextFrag.setArguments(args); // Fragment内部获取参数示例 @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { String param = getArguments().getString("param_key"); } }
3. 移除Gradle中的Lint忽略配置
现在代码符合规范,删掉以下配置:
lintOptions { disable 'ValidFragment' }
内容的提问来源于stack exchange,提问作者Antonely93
相关产品推荐
相关产品推荐

