【问题标题】:Why is my activity context null in my fragment?为什么我的片段中的活动上下文为空?
【发布时间】:2014-12-26 17:16:35
【问题描述】:

我正在尝试创建一个样板片段。当我尝试设置 RecyclerView 的 LayoutManager 时,我不断收到空引用错误:

尝试调用虚方法'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' 在空对象引用上

以下是我调用以获取错误的顺序:

Main.class:

public class PagerAdapter extends FragmentPagerAdapter {
    ...
    @Override
    public Fragment getItem(int position){
        switch(position){
            default:
                return new WhatsNew();
        }
    }
}

WhatsNew.class:

public class WhatsNew extends Base {

    private LayoutInflater mInflater;
    private Handler mHandler = new Handler();

    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    public void init() {
        mInflater = LayoutInflater.from(mContext);
        mLayoutManager = new LinearLayoutManager(mContext);
        mDataView.setLayoutManager(mLayoutManager);  //<-- Where the null reference is
    }

    @Override
    public void doWork() {

        WhatsNewAdapter mAdapter = new WhatsNewAdapter();
        mDataView.setAdapter(mAdapter);
        ...

    }

    ...
}

Base.class:

public class Base extends Fragment {

    public View mView;
    public RecyclerView mDataView;
    public ProgressBar mProgressBar;
    public Context mContext;

    public Base() { }

    @Override
    public void onAttach(Activity mActivity) {
        mContext = mActivity;
        init();
        doWork();
    }

    @Override
    public View onCreateView(LayoutInflater _i, ViewGroup _vg, Bundle savedInstanceBundle){
        mView = _i.inflate(R.layout.f_base, null);
        mDataView = (RecyclerView) mView.findViewById(R.id.data);
        mProgressBar = (ProgressBar)mView.findViewById(R.id.loading);
        return mView;
    }

    public void init() { }

    public void doWork() { }

}

我从here 读到我应该覆盖onAttach(Activity activity) 以确保上下文不为空,但从错误来看,它似乎仍然为空。任何人都知道为什么我会偶然遇到这个错误,或者对我应该如何设置我的样板片段有更好的建议?抱歉,如果代码看起来很糟糕,我正在尝试更好地学习使用片段。 :)

【问题讨论】:

  • 尝试在 onCreateView() 或 onViewCreated() 中调用 init()doWork()

标签: java android android-fragments


【解决方案1】:

onAttach()onCreateView() 之前被调用。

所以 mDataView 在 init() 处为空。

我建议致电init()doWork() onViewCreated()

【讨论】:

    【解决方案2】:

    您的mDataView 尚未初始化。

    onAttach()onCreateView() 之前调用。 init() 使用 mDataViewmDataViewonCreateView() 中初始化之前被调用。

    将需要访问片段视图的代码推迟到onCreateView() 或更高版本。

    【讨论】:

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