【问题标题】:getActivity() returns null on fragment?getActivity() 在片段上返回 null?
【发布时间】:2017-05-05 10:50:36
【问题描述】:

我有MainActivity()FirstFragment()

我正在从MainActivity() 调用 FirstFragment 中的一个函数。

问题是,那个时候 getActivity() 返回 null ?

【问题讨论】:

  • 请出示您的代码。
  • 提供一些代码
  • 发布你是如何在活动中加载片段的?
  • 我想你问的也一样,stackoverflow.com/questions/10903077/…
  • 你应该对 Fragment 生命周期感兴趣。在某些状态下,getActivity 可以返回 null。

标签: android nullpointerexception fragment


【解决方案1】:

片段开始时执行此操作

public void onViewCreated(View view, Bundle savedInstanceState) {
    mcontext=getContext();

如果您需要,mcontext 很容易被转换为活动。

自 Android API 级别 23 起,onAttach(Activity activity) 已被弃用。您需要使用 onAttach(Context context)。 http://developer.android.com/reference/android/app/Fragment.html#onAttach(android.app.Activity) 所以如果你想使用 onattach 你需要做

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    Activity a;
    if (context instanceof Activity){
         a=(Activity) context;
    }
} 

不要做

  if(getActivity()==null){

当您将应用程序移至后台并返回时,get Activity 将返回 null。 如果你使用它,它有时会忽略这部分代码,这会产生你不明白它们来自哪里的错误。

【讨论】:

    【解决方案2】:

    请使用来自onAttach()Activity 引用。我认为这是使用 Fragment 中的Activity 实例的最佳实践

     public class FirstFragment extends Fragment {
     private Activity mActivity;
         @Override
            public void onAttach(Context context) {
                super.onAttach(context);
                mActivity = (Activity) context;//use this one .. this is MainActivity instance u can use this as MainActivity mMainActivity = (MainActivity)mActivity;
            }
      }
    

    【讨论】:

    • 从我在其他地方读到的内容来看,这只是一种创可贴式的修复。因为持有活动引用可能会导致整个活动泄漏。理想的解决方案是在活动对象引用为空时不对它执行任何操作。
    【解决方案3】:
    // declare a variable activity in your fragment
    private Activity activity;
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    
        if (context instanceof Activity) {
            this.activity = (Activity) context;
        }
    
    }
    
    @Override
    public void onDetach() {
        super.onDetach();
        this.activity = null;
    }
    
    
    private void initToolbar() {
    
        // then use the var in any function
        if (activity == null) {
            return;
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      而不是使用 Activity 引用。您可以创建 Context 类的引用。

      private Context context;
      
      @Override
      public void onAttach(Context context) {
          super.onAttach(context);
          if (context instanceof Activity) {//Name of your activity
              this.context = (Activity) context;
          }
      }
      

      【讨论】:

        【解决方案5】:

        我觉得你应该通过context这样试试

        if(isNetworkAvailable(getActivity().getContext())) 
        {
            System.out.println("Internet is On.");
        } 
        

        【讨论】:

          【解决方案6】:
          private Context mContext;
          
          @Override
          public void onAttach(Context context) {
              super.onAttach(context);
          mContext = context;
          }
          

          然后在你想在'MainActivity'中调用函数的地方是这样的:

          ((MainActivity)mContext).theFunctionYouWanToCall();
          

          或者如果片段可能属于多个活动,则首先检查:

          if(MainActivity instanceOf mContext)
            ((MainActivity)mContext).theFunctionYouWanToCall();
          

          希望对您有所帮助!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-30
            • 2012-07-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-27
            相关资源
            最近更新 更多