【问题标题】:Get the Application Context In Fragment In Android?在 Android 的 Fragment 中获取应用程序上下文?
【发布时间】:2013-12-26 04:30:00
【问题描述】:

我通过在一个活动中使用应用程序上下文将一些数据存储到全局类。稍后我必须在片段中检索这些值。我做了这样的事情来存储在 Global Class 中。

AndroidGlobalClass  AGC = ((AndroidGlobalClass) getApplicationContext());
AGC.setUser_access("XYZ");
AGC.setFirst_name("ABC");

在清单中我已经完成了:

<application
    android:name=".AndroidGlobalClass"
    android:theme="@style/AppTheme" >
    <activity
       android:name="abc.SignInActivity"
       android:label="@string/app_name" >
       <intent-filter>
          <action android:name="android.intent.action.MAIN" />
          <category android:name="android.intent.category.LAUNCHER" />
       </intent-filter>
    </activity>
</application>

现在当我尝试使用此获取应用程序上下文时...我没有获取上下文...

AndroidGlobalClass  AGC = ((AndroidGlobalClass) getApplicationContext());

这是我的片段活动

public class Fragment_NewsFeed extends Fragment {
    public Fragment_NewsFeed() {
    }

    RestImplimentationMethods RIM;
    AndroidGlobalClass AGC;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_newsfeed, container, false);
        return rootView;
    }
}

【问题讨论】:

  • 小心“尽快”寻求帮助。你吓跑了任何可能想给你一个很好的彻底答案的人。正如您所看到的,您最终会得到一堆没有真正帮助的单行答案。
  • 或使用isAdded() 检查天气片段是否附加到活动,如果附加,您将能够获得getActivity().getApplicationContext() :)。这样您就可以确保永远不会出现 NPE 错误,并且应用程序不会崩溃

标签: android android-fragments fragment


【解决方案1】:

您可以使用以下方式获取上下文 getActivity().getApplicationContext();

【讨论】:

  • 小心你在哪里调用它,因为如果片段已分离,getActivity() 将返回 null
  • 在你的 Application 类中创建一个静态应用上下文,并在 onCreate() 中赋值: MyApplication.sContext = getApplicationContext();然后,您可以从任何活动中访问它,而不必担心片段分离。
  • 不用.getApplicationContext(),只要getActivity()就够了。
  • 只有在必须传递上下文的对象具有全局上下文时才获得getApplicationContext(),否则迟早要为OOM做好准备。
  • @Borzh getActivity() 不会为您提供应用程序上下文,并且会在活动重新创建后导致内存泄漏并保留片段。如果您没有特别需要,则不建议使用该上下文。如果足够的话,最好调用 getApplicationContext()。
【解决方案2】:

使用

getActivity().getApplicationContext()

获取任何片段中的上下文

【讨论】:

  • 小心,这仅在片段当前附加到活动时才有效!
  • @A.Steenbergen 什么情况下没有附加?
  • @Sreekanth Karumanaghat 屏幕旋转时会发生这种情况。查看片段生命周期。
  • @A.Steenbergen 我的应用只为纵向设计,还有其他适用的情况吗?
  • @Sreekanth Karumanaghat 可能存在状态恢复情况,请参考片段生命周期
【解决方案3】:

Kotlin 中,我们可以使用 this 在片段中获取应用程序上下文

requireActivity().application

【讨论】:

    【解决方案4】:

    你可以定义一个全局变量:

    private Context globalContext = null;
    

    并在 onCreate 方法中对其进行初始化:

    globalContext = this.getActivity();
    

    这样您就可以在所有片段函数/方法中使用“globalContext”变量。

    祝你好运。

    【讨论】:

    • 分离片段时,getActivity() 返回 null。在重新创建活动时,片段通常在其自己的 onCreate() 期间分离。在您的应用程序被推出内存后,这可能会因 NullPointerException 而崩溃。此外,getActivity() 不会返回应用程序上下文。它需要再次调用 .getApplicationContext()。
    • @colintheshots,如果片段是在活动的 onCreate() 中创建的,片段是否可以在其自己的 onCreate() 期间实际分离?
    • 通常在 onCreate() 期间附加一个片段。但是,globalContext 稍后可以引用在分离时或重新附加后不再存在的活动。此外,它不提供应用程序上下文,而是提供活动上下文。
    【解决方案5】:

    尝试使用getActivity(); 这将解决您的问题。

    【讨论】:

    • 你能具体写下如何​​获取我的代码的应用程序上下文的代码吗?我的代码有问题
    • getActivity().getApplicationContext();将..谢谢
    • AndroidGlobalClass AGC = new AndroidGlobalClass (getActivity());
    【解决方案6】:

    相当晚的响应,但您可以在 Kotlin 中执行以下操作:

    activity?.applicationContext?.let { SymptomsAdapters(it, param2, param3, ...) }
    

    (?.) 用于安全的空操作,防止空指针异常。

    您不希望创建新的上下文,因为这会在片段之间交换或设备更改旋转时导致内存泄漏。

    正如上面提到的,在 Java 中,您可以通过执行以下操作来获取片段中的上下文:

    getActivity().getApplicationContext()
    

    【讨论】:

      【解决方案7】:

      在支持库 27.1.0 及更高版本中,Google 引入了新方法 requireContext()requireActivity() 方法。

      例如:ContextCompat.getColor(requireContext(), R.color.soft_gray)

      更多信息here

      【讨论】:

      • 这是一个很好的答案,但是如果一个片段被分离,它们仍然返回null
      【解决方案8】:

      它对我有用

      private Context contextUApp;
      

      ... 在创建...

      contextUApp = view.getContext();
      

      或使用

      requireContext()
      

      【讨论】:

      • 你确定这个返回的 applicationContext 不是活动上下文吗?
      【解决方案9】:

      将此添加到 onCreate

      // Getting application context
              Context context = getActivity();
      

      【讨论】:

      • 这不是应用程序上下文!将此上下文与在活动重新创建中保留的片段一起使用将导致内存泄漏!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多