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

Android Fragment返回键失效:FragmentBell返回FragmentHome无响应修复

修复Fragment返回键失效问题

问题根源

Fragment本身没有onBackPressed()生命周期回调方法,你在Fragmentbell中定义的这个方法永远不会被系统触发,所以自定义的goToHome()自然无法执行。

解决方案

推荐使用AndroidX提供的OnBackPressedCallback来在Fragment中处理返回键逻辑,这是官方推荐的Fragment级返回键处理方式,步骤如下:

  1. 移除Fragmentbell中无效的onBackPressed()方法
  2. 在Fragment的onViewCreated方法中注册返回键回调

修改后的完整代码

public class Fragmentbell extends Fragment {

    LinearLayout linearLayout;
    private View root_view;
    private RecyclerView recyclerView;
    private SwipeRefreshLayout swipeRefreshLayout;
    private Adapterbell adapterbell;
    public static final String EXTRA_OBJC = "key.EXTRA_OBJC";
    DbHandler databaseHandler;

    private ArrayList<bell> mNotificationList;

    private ShimmerFrameLayout lyt_shimmer;
    SharedPref sharedPref;
    private List<bell> data = new ArrayList<>();

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        root_view = inflater.inflate(R.layout.fragment_bell, container, false);
        loadDataFromDatabase();

        recyclerView = root_view.findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(1, LinearLayoutManager.VERTICAL));
        recyclerView.addItemDecoration(new EqualSpacingItemDecoration(0));
        recyclerView.setHasFixedSize(true);

        adapterbell = new Adapterbell(getActivity(), recyclerView, data);
        recyclerView.setAdapter(adapterbell);
        recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));

        adapterbell.setOnItemClickListener((v, obj, position) -> {
            databaseHandler = new DbHandler(getActivity());
            databaseHandler.updateStatus(data.get(position).getId(), true);
            ((MainActivity) getActivity()).showInterstitialAd();

            Intent intent = new Intent(getActivity(), ActivityNotificationDetail.class);
            intent.putExtra("id", (data.get(position).getpost_id()));
            Log.v("testti", "" + v.getTag() + " apakah sama " + data.get(position).getpost_id());
            this.startActivity(intent);
        });

        return root_view;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        
        // 注册返回键回调
        requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) {
            @Override
            public void handleOnBackPressed() {
                // 执行返回首页的逻辑
                goToHome();
            }
        });
    }

    private void loadDataFromDatabase() {
        databaseHandler = new DbHandler(getActivity());
        data = databaseHandler.getAllbell();
    }

    private void goToHome() {
        Fragment newFragment = new FragmentHome();
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.container, newFragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}

补充说明

  • getOnBackPressedDispatcher()是AndroidX Activity提供的返回键分发器,通过它可以在Fragment中安全地处理返回键事件
  • getViewLifecycleOwner()确保回调和Fragment的视图生命周期绑定,避免内存泄漏
  • 如果你的项目还没迁移到AndroidX,可以使用setOnKeyListener给Fragment的根视图设置按键监听,但推荐优先使用上述官方方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 08:13:23