为了账号安全,请及时绑定邮箱和手机立即绑定

getActivity()在片段函数中返回NULL

getActivity()在片段函数中返回NULL

慕标琳琳 2019-07-03 16:36:02
我有一个片段(F1),它使用这样的公共方法public void asd() {     if (getActivity() == null) {         Log.d("yes","it is null");     }}是的,当我叫它(从活动中),它是空的.FragmentTransaction transaction1 = getSupportFragmentManager().beginTransaction(); F1 f1 = new F1();transaction1.replace(R.id.upperPart, f1);transaction1.commit();f1.asd();这一定是我做错了什么,但我不知道那是什么
查看完整描述

3 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

commit调度事务,即它不是直接发生的,而是在主线程下一次准备就绪时作为对主线程的工作进行调度。

我建议增加一个

onAttach(Activity activity)

方法对您的Fragment并在其上放置一个断点,并查看它何时被调用相对于您对asd()..您将看到在调用的方法之后调用它。asd()出口。这个onAttach呼叫是Fragment与它的活动有关,从这一点开始getActivity()将返回非空(nb也有onDetach()打电话)。


查看完整回答
反对 回复 2019-07-03
?
UYOU

TA贡献1878条经验 获得超4个赞

最好的办法是在调用onAttach时保留活动引用,并在需要时使用活动引用。

@Overridepublic void onAttach(Context context) {
    super.onAttach(activity);
    mContext = context;}@Overridepublic void onDetach() {
    super.onDetach();
    mContext = null;}


查看完整回答
反对 回复 2019-07-03
?
浮云间

TA贡献1829条经验 获得超4个赞

这发生在你打电话的时候getActivity()在删除片段后完成的另一个线程中。典型的情况是getActivity()(前。为了Toast)当HTTP请求完成时(在onResponse例如)。

为了避免这种情况,您可以定义一个字段名。mActivity用它代替getActivity()..该字段可以在片段的onAttach()方法中初始化,如下所示:

@Overridepublic void onAttach(Context context) {
    super.onAttach(context);

    if (context instanceof Activity){
        mActivity =(Activity) context;
    }}

在我的项目中,我通常用以下特性为我的所有片段定义一个基类:

public abstract class BaseFragment extends Fragment {

    protected FragmentActivity mActivity;

    @Overridepublic void onAttach(Context context) {
    super.onAttach(context);

    if (context instanceof Activity){
        mActivity =(Activity) context;
    }}}

快乐的编码,


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 553 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信