如何在Fragment类中获取应用程序对象

63

我正在修改我的安卓移动应用程序,以支持平板电脑和手机。为此,我将我的活动类更改为片段类。在我的活动类中,我创建了以下应用程序类实例:

appCtx = (UnityMobileApp) getApplication();

这里的UnityMobileApp是我的Application类。

现在我想在我的Fragment类中创建相同的实例。你们能帮我解决这个问题吗?


1
你需要发布更多的代码片段。谢谢 :) - SALMAN
6个回答

145

在你的片段中使用appCtx = (UnityMobileApp) getActivity().getApplication();


23
请注意,在某些情况下,上述代码会抛出NPE异常,因为它可能在getActivity()返回null的情况下被调用(例如,在旋转过程中)。 - Ognyan
10
在代码中使用:@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); app = ((MyApplication) getActivity().getApplication()); }翻译为中文:重写方法:@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); app = ((MyApplication) getActivity().getApplication()); }在此处使用: 获取应用程序实例并将其赋值给变量app。 - Dzianis Yafimau

4

getActivity() 方法可能返回 null,这可能导致应用程序崩溃。因此,在 onActivityCreated() 中使用该方法是安全的。例如:

private UnityMobileApp appCtx;
.
.
...
@Override
public View onCreateView(...){
...
}

@Override public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     appCtx = ((UnityMobileApp) getActivity().getApplication()); 
} 
...
//access the application class methods using the object appCtx....

本答案源于Dzianis Yafima在stackoverflow上回答Ognyan的提问。因此,感谢 Dzianis Yafima 和 Ognyan。


4

如果有人在寻找Kotlin版本,这个对我有效:

(activity?.application as YourApplicationClass)

2
一种更新的方法:

Application application = requireActivity().getApplication();

1
由于您正在尝试从片段中使用应用程序上下文,因此您不能使用getApplication(),因为它不是Fragment类的方法。因此,您首先必须使用getActivity(),它将返回与该片段当前关联的Fragment Activity。
在您的代码中,代替this.getApplication(),您必须使用getActivity.getApplication()
了解有关getActivity()的更多信息,请参见android documentation

1

或者使用 Kotlin

fun bar() {
   (activity?.application as UnityMobileApp).let {
      it.drink()
   } ?: run {
      Log.d("DEBUG", "(╯°□°)╯︵ ┻━┻")
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接