【问题标题】:Android Fragment null pointer when fetching view获取视图时的Android Fragment空指针
【发布时间】:2013-03-29 00:14:54
【问题描述】:

当适配器更改片段内的列表视图时,我一直在用片段碰壁并触发视图刷新。现在我有:

  • 持有 FragmentManager 的主要活动
  • Activity 通过 FragmentPagerAdapter.getItem 方法根据位置创建片段
  • 随后的活动或按钮按下会导致其中一个 Fragment 背后的数据发生变化
  • activity调用自定义Fragment类的refresh方法触发数据刷新
  • 刷新方法获取片段中的ListView对象
    • 这就是发生 Null 异常的地方

刷新方法如下:

public void refresh() {
  groups = new Select()
    .from(Group.class)
    .execute();

  listView = (ListView)getActivity().findViewById(R.id.overview_container);
  // Never get here
  groupAdapter.clear();
  groupAdapter.setItems(groups);
  listView.invalidateViews();   
}

设置是

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  view = inflater.inflate(R.layout.fragment_overview, container, false);

  groups = new Select()
    .from(Group.class)
    .execute();

  listView = (ListView)view.findViewById(R.id.overview_container);
  listView.setAdapter(new GroupAdapter(view.getContext(), R.layout.time_view, groups));     
  return view;
}

我在这里缺少一些基本的东西吗?这里有像听众这样更简单的模式可以解决这个问题吗?我似乎无法让视图返回 null 之外的任何内容 - 即使我存储它。

【问题讨论】:

  • 你确定这是在 onAttach() 之后调用的吗?你确定有一个 ListView 的 ID 当前在 Activity 中被夸大了吗?
  • 您最好在 onCreateView 方法中找到您的列表视图,然后保存其实例或类似的东西以在必要时刷新它...
  • 这至少在 onCreateView 之后被调用 - 但是当 Fragment 被主动显示在屏幕上时会调用刷新
  • 我确实将 ListView 存储在 onCreateView 方法中,但它仍然为空。

标签: java android view fragment


【解决方案1】:

我通过 FragmentManager 获取 Fragment 并转换为原始接口以运行接口方法 - 这似乎返回了一个意外的版本,它不一定是活动的 Fragment,从而导致了我遇到的问题。

相反,我保留自己对生成的片段的引用,以便我可以随意引用它们。

【讨论】:

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