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

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


当前回答

那些仍然有问题的onAttach(活动活动),它只是改变了上下文-

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

在大多数情况下,保存上下文对您来说就足够了——例如,如果您想执行getResources(),您可以直接从上下文执行。如果你仍然需要将上下文放入你的活动中,那么就这样做吧

 @Override
public void onAttach(Context context) {
    super.onAttach(context);
    mActivity a; //Your activity class - will probably be a global var.
    if (context instanceof mActivity){
        a=(mActivity) context;
    }
}

由user1868713建议。

其他回答

那些仍然有问题的onAttach(活动活动),它只是改变了上下文-

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

在大多数情况下,保存上下文对您来说就足够了——例如,如果您想执行getResources(),您可以直接从上下文执行。如果你仍然需要将上下文放入你的活动中,那么就这样做吧

 @Override
public void onAttach(Context context) {
    super.onAttach(context);
    mActivity a; //Your activity class - will probably be a global var.
    if (context instanceof mActivity){
        a=(mActivity) context;
    }
}

由user1868713建议。

在哪里调用这个函数?如果在Fragment的构造函数中调用它,它将返回null。

当onCreateView()方法被执行时,只需调用getActivity()。

最好的办法是在onAttach被调用时保持活动引用,并在任何需要的地方使用活动引用。

@Override
public void onAttach(Context context) {
    super.onAttach(activity);
    mContext = context;
}

@Override
public void onDetach() {
    super.onDetach();
    mContext = null;
}

我用这种方法解决了我的问题。我已经从前一个类传递了getApplicationContext,它已经访问了getApplicationContext。我已经将Inputstream对象传递给我的新类营养素。

try{
                    InputStream is= getApplicationContext().getAssets().open("nutrient_list.json");
                    Nutrients nutrients=Nutrients.getNutrients(topRecognition,is);

                  } catch (IOException e) {
                    e.printStackTrace();
                  }

The other answers that suggest keeping a reference to the activity in onAttach are just suggesting a bandaid to the real problem. When getActivity returns null it means that the Fragment is not attached to the Activity. Most commonly this happens when the Activity has gone away due to rotation or the Activity being finished but the Fragment still has some kind of callback listener registered preventing it from being garbage collected. When the listener gets called if you need to do something with the Activity but the Activity is gone there isn't much you can do. In your code you should just check getActivity() != null and if it's not there then don't do anything. If you keep a reference to the Activity that is gone you are preventing the Activity from being garbage collected. Any UI things you might try to do won't be seen by the user. I can imagine some situations where in the callback listener you want to have a Context for something non-UI related, in those cases it probably makes more sense to get the Application context. Note that the only reason that the onAttach trick isn't a big memory leak is because normally after the callback listener executes it won't be needed anymore and can be garbage collected along with the Fragment, all its View's and the Activity context. If you setRetainInstance(true) there is a bigger chance of a memory leak because the Activity field will also be retained but after rotation that could be the previous Activity not the current one.