Android Fragment返回键失效:FragmentBell返回FragmentHome无响应修复
修复Fragment返回键失效问题
问题根源
Fragment本身没有onBackPressed()生命周期回调方法,你在Fragmentbell中定义的这个方法永远不会被系统触发,所以自定义的goToHome()自然无法执行。
解决方案
推荐使用AndroidX提供的OnBackPressedCallback来在Fragment中处理返回键逻辑,这是官方推荐的Fragment级返回键处理方式,步骤如下:
- 移除
Fragmentbell中无效的onBackPressed()方法 - 在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
相关产品推荐
相关产品推荐

