我有一个片段(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建议。
这发生在您在另一个线程中调用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;
}
}
}
快乐的编码,