【问题标题】:Why is my context in my Fragment null?为什么我的片段中的上下文为空?
【发布时间】:2013-08-09 20:14:19
【问题描述】:

我有一个关于片段中上下文使用的问题。我的问题是我总是得到一个 NullpointerException。这是我的工作:

创建一个扩展 SherlockFragment 的类。在那个类中,我有另一个 Helper 类的实例:

public class Fragment extends SherlockFragment { 
    private Helper helper = new Helper(this.getActivity());

    // More code ...
}

这是另一个 Helper 类的摘录:

public class Helper {
    public Helper(Context context) {
        this.context = context;
    }
    // More code ...
}

每次我调用 context.someMethod(例如 context.getResources() )我都会收到 NullPointerException。这是为什么呢?

【问题讨论】:

  • 看起来SherlockFragment#activity 在初始化片段时未设置,而是在稍后阶段注入,因此在构造函数中为null。

标签: java android nullpointerexception android-context


【解决方案1】:

当Fragment 首次实例化时,您正试图获取Context。当时,它没有附加到Activity,因此没有有效的Context。

看看Fragment Lifecycle。 onAttach() 到 onDetach() 之间的所有内容都包含对有效 Context 实例的引用。这个 Context 实例通常通过getActivity()检索到

代码示例:

private Helper mHelper;

@Override
public void onAttach(Activity activity){
   super.onAttach (activity);
   mHelper = new Helper (activity);
}

我在示例中使用了onAttach(),@LaurenceDawson 使用了onActivityCreated()。注意差异。由于onAttach() 已经将Activity 传递给它,因此我没有使用getActivity()。相反,我使用了传递的参数。对于生命周期中的所有其他方法,您必须使用getActivity()。

【讨论】:

  • @user2426316 我添加了一个示例。我的和 LaurenceDawson 的都应该工作。
【解决方案2】:

你什么时候实例化你的 Helper 类?确保它在 Fragment 生命周期中的 onActivityCreated() 之后。

http://developer.android.com/images/fragment_lifecycle.png

以下代码应该可以工作:

@Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    helper = new Helper(getActivity());
  }

【讨论】:

    【解决方案3】:

    getActivity() 可以返回 null 如果它在 onAttach() 被调用之前被调用。我会推荐这样的东西:

    public class Fragment extends SherlockFragment { 
    
        private Helper helper;
    
        // Other code
    
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            helper = new Helper(activity);
        }
    } 
    

    【讨论】:

      【解决方案4】:

      您好,问题已回答,但通常如果您想在片段或对话框片段中获取上下文,请使用此

      protected lateinit var baseActivity: BaseActivity
      protected lateinit var contextFragment: Context
      
      override fun onAttach(context: Context) {
          super.onAttach(context)
          if (context is BaseActivity) {
              this.baseActivity = context
          }
          this.contextFragment = context
      }
      

      在java中

       protected BaseActivity baseActivity;
       protected Context context;
      
       @Override
       public void onAttach(@NonNull Context context) {
          super.onAttach(context);
          this.context = context;
          if (context instanceof BaseActivity) {
              this.baseActivity = (BaseActivity) context;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-12-26
        • 2023-02-26
        • 2017-07-06
        • 1970-01-01
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        相关资源
        最近更新 更多