前言

正在学习Android的路上,服完国内这帮老掉牙的技术教程了,个人本想在 Fragment 中实现页面的跳转,奈何却被绊倒在了监听按钮事件上。

破事其一 OnActivityCreated()被弃用

Fragment 的 OnActivityCreated() 方法早已不能使用,国内大部分抄来抄去的教程还在tmd用这个方法教!官方的意思是为了减少页面耦合性,这我能理解,在这个方法弃用之后官方给出了一个解决方案——即使用 Lifecycle 来监听 Activity 的 Created 状态,即

1
2
3
4
5
6
7
8
9
10
11
requireActivity().getLifecycle().addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull @NotNull LifecycleOwner source, @NonNull @NotNull Lifecycle.Event event) {
if (event.getTargetState() == Lifecycle.State.CREATED) {//监听Activity的Created事件

//这里写希望执行的代码段

getLifecycle().removeObserver(this); //删除观察者
}
}
});

将这一大串放在 Fragment 的 OnAttach() 中,当 Lifecycle 检测到 Fragment 的 Activity 创建流程有所变动,就能捕捉到并运行 onStateChanged() 。

破事其二 过去的 Fragment 看不到未来的 Activity

OnActivityCreated() 的问题确实解决了。但这有一个问题,我想要的效果是点击按钮后跳转到新的页面,而跳转这个动作需要执行 startActivity(Intent(Activity,NextAvtivity.class)) ,Intent 参数中的 Class 问题不大肯定有,但要怎么让过去的 Fragment 提供一个未来的 Activity 呢。

如下图所示,这是 Fragment 生命周期中能够被获取到的几个状态

只有当 OnActivityCreated 时,Fragment 才能知晓可用的 Activity ,在此之前如果你使用 getActivity() 会回返 null ,所以我们在 ActivityCreated 之前的Fragment 中 getActivity() 的回返都会是 null 。

看着图思考,终于脑袋开窍,峰回路转。既然我不能在 OnActivityCreated,我使用下一条流程 OnStart() 不就行了嘛,因为追究 OnActivityCreated() 这破事,害的我完全钻进了牛角尖,老旧教程害人啊🤣。

所以我们只需要选择在 OnActivityCreated() 流程之后的 OnStart() 流程设置点击监听就ok了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Override
public void onStart() {
super.onStart(); //在OnStart()设置控件的点击事件!
regOnClick();
}

public void regOnClick(){
Intent intent = new Intent();
OptionView optionViewLog = (OptionView) getActivity().findViewById(R.id.logOption);
;
optionViewLog.findViewById(R.id.optionList).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
intent.setClass(getActivity(), LogActivity.class);
startActivity(intent); //跳转!
}
});
}

如此这般,你就发现你的跳转能用了。

后记

这篇教程是一边写一边思考一边码代码的,除了水水博客,也是为了整理思路,有任何纰漏,烦请大神指点。