猿问

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

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

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


慕标琳琳
浏览 554回答 3
3回答

慕桂英3389331

commit调度事务,即它不是直接发生的,而是在主线程下一次准备就绪时作为对主线程的工作进行调度。我建议增加一个onAttach(Activity activity)方法对您的Fragment并在其上放置一个断点,并查看它何时被调用相对于您对asd()..您将看到在调用的方法之后调用它。asd()出口。这个onAttach呼叫是Fragment与它的活动有关,从这一点开始getActivity()将返回非空(nb也有onDetach()打电话)。

UYOU

最好的办法是在调用onAttach时保留活动引用,并在需要时使用活动引用。@Overridepublic void onAttach(Context context) {     super.onAttach(activity);     mContext = context;}@Overridepublic void onDetach() {     super.onDetach();     mContext = null;}

浮云间

这发生在你打电话的时候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;     }}}快乐的编码,
随时随地看视频慕课网APP

相关分类

Android
我要回答