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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:35:55