我有一个片段(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();

一定是我做错了什么,但我不知道是什么。


当前回答

在commit()之后调用回调函数的顺序:

无论你在commit()之后手动调用什么方法 onAttach () onCreateView () onActivityCreated ()

我需要做一些涉及一些视图的工作,所以onAttach()不适合我;它坠毁。所以我移动了我的代码的一部分,设置一些参数在一个方法调用后立即提交()(1.),然后在onCreateView()(3.)内处理视图的代码的另一部分。

其他回答

Commit调度事务,也就是说,它不会立即发生,而是在下一次主线程准备就绪时在主线程上进行调度。

我建议加一个

onAttach(Activity activity)

方法,并在它上面放一个断点,看看它什么时候相对于你对asd()的调用被调用。您将看到它在您调用asd()退出的方法之后被调用。onAttach调用是片段附加到其活动的地方,从这一点上getActivity()将返回非空(注意还有一个onDetach()调用)。

在onActivityCreated()中调用getActivity()方法

在commit()之后调用回调函数的顺序:

无论你在commit()之后手动调用什么方法 onAttach () onCreateView () onActivityCreated ()

我需要做一些涉及一些视图的工作,所以onAttach()不适合我;它坠毁。所以我移动了我的代码的一部分,设置一些参数在一个方法调用后立即提交()(1.),然后在onCreateView()(3.)内处理视图的代码的另一部分。

自Android API级别23起,onAttach(Activity Activity)已弃用。你需要使用onAttach(Context Context)。http://developer.android.com/reference/android/app/Fragment.html onAttach (android.app.Activity)

Activity是一个上下文,所以如果你可以简单地检查上下文是否是一个Activity,并在必要时强制转换它。

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    Activity a;

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

}

这发生在您在另一个线程中调用getActivity()时,该线程在片段被删除后结束。典型的情况是在HTTP请求完成时调用getActivity()(例如Toast)(例如onResponse)。

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

@Override
public void onAttach(Context context) {
    super.onAttach(context);

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

在我的项目中,我通常用这个特性为我所有的Fragments定义一个基类:

public abstract class BaseFragment extends Fragment {

    protected FragmentActivity mActivity;

    @Override
public void onAttach(Context context) {
    super.onAttach(context);

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

快乐的编码,