AndroidAnnotations在继承Fragment类时无法正常工作的问题
问题分析与解决方案
咱先把问题根源捋明白:AndroidAnnotations(AA)是靠Fragment的onCreateView生命周期阶段来完成视图注入、事件绑定这些核心操作的。但你的父类NavMenu在满足else条件时直接返回了null,这就导致子类NavMenuStats里的AA注解根本没有可操作的视图实例,自然没法正常工作。
下面给你两个可行的解决思路:
思路一:调整父类的onCreateView逻辑(优先推荐)
既然返回null是问题的导火索,那最好直接修改父类的条件分支,绝对不要返回null。比如把else分支改成返回一个空的容器布局,后续再根据需求控制显示隐藏:
@Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (some condition) { View view = ... // 保留原来的正常视图创建逻辑 return view; } else { // 返回空的FrameLayout,保证视图实例存在 return new FrameLayout(inflater.getContext()); } }
如果else分支原本的意图是隐藏Fragment,那可以把显示隐藏的逻辑移到onViewCreated里处理,比如调用getView().setVisibility(View.GONE),这样既符合Fragment生命周期规范,也能让AA正常工作。
思路二:子类重写onCreateView覆盖父类逻辑
如果父类代码没办法修改,那就在NavMenuStats里重写onCreateView,强制给AA提供可用的视图。假设你的子类用了@EFragment注解,代码可以这么写:
@EFragment(R.layout.fragment_nav_menu_stats) public class NavMenuStats extends NavMenu { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // 先执行父类的逻辑 View parentView = super.onCreateView(inflater, container, savedInstanceState); // 如果父类返回了有效视图,直接用它 if (parentView != null) { return parentView; } // 父类返回null的话,让AA自己处理布局加载和注解注入 return inflater.inflate(R.layout.fragment_nav_menu_stats, container, false); } }
这里要注意,AA生成的子类会自动处理视图注入,所以只要保证onCreateView返回了正确的布局视图,AA就能完成后续的注解工作。
另外补充个小建议:尽量不要在onCreateView里返回null,这本身就不符合Fragment的设计规范,容易引发各种生命周期相关的问题,提前把条件判断移到onCreate阶段会更稳妥。
内容的提问来源于stack exchange,提问作者Luís Henriques
相关产品推荐
相关产品推荐

