【问题标题】:getActivity returns null in FragmentgetActivity 在 Fragment 中返回 null
【发布时间】:2012-12-10 00:46:18
【问题描述】:

我有一个基本上是列表视图的片段。父活动调用一个方法来从服务中检索花名册项目列表。当数据从服务返回时,我在通过的片段和名册项目的 ArrayList 上调用 updateRosterItems。问题是它第一次工作,但是当我选择一个不同的选项卡,然后返回到带有片段的选项卡时,getActivity() 返回 null,我无法将数据连接到 ArrayAdapter。

这是 updateRosterItems 函数的代码:

public void updateRosterList(ArrayList<RosterInfo> rosterItems)
{
    if(_adapter == null)
    {
        _adapter = new RosterItemAdapter(getActivity(), R.layout.roster_listview_item, rosterItems);
    }

    Activity activity = getActivity();
    if(activity != null)
    {
        ListView list = (ListView)activity.findViewById(R.id.lstRosterItems);

        list.setAdapter(_adapter);
        _adapter.notifyDataSetChanged();
    }
}

我已经阅读过在附加片段之前调用代码导致的类似问题。我想我的问题是,有没有办法延迟对 updateRosterList 的调用,直到调用 onAttach 之后?我正在玩弄的解决方案是,如果 getActivity() 返回 null 然后将数据存储在片段中的私有变量中,并在 onAttach 方法中检查变量中是否有数据,然后在适配器上调用更新。不过,这似乎有点 hacky。有什么想法吗?

【问题讨论】:

    标签: android android-fragments android-activity


    【解决方案1】:

    更新:我已经设法通过这样做来让它工作。我对 Android 开发很陌生,作为一种解决方案对我来说似乎有点 hacky。有没有更好的办法?基本上 updateRosterList 函数是从片段外部调用的函数。

    public class RosterListFragment extends Fragment {
    
    RosterItemAdapter _adapter = null;
    private ArrayList<RosterInfo> _items;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.roster_listview, container, false);
    }
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
    
        if(_items != null)
        {
            performUpdateRosterList(_items);
        }
    
    }
    
    public void updateRosterList(ArrayList<RosterInfo> rosterItems)
    {
        Activity activity = getActivity();
        if(activity != null)
        {
            performUpdateRosterList(rosterItems);
        }
        else
        {
            _items = rosterItems;
        }
    }
    
    private void performUpdateRosterList(ArrayList<RosterInfo> rosterItems)
    {
        Activity activity = getActivity();
        if(_adapter == null)
        {
            _adapter = new RosterItemAdapter(activity, R.layout.roster_listview_item, rosterItems);
        }
    
        ListView list = (ListView)activity.findViewById(R.id.lstRosterItems);
    
        list.setAdapter(_adapter);
        _adapter.notifyDataSetChanged();
    }
    
    }
    

    【讨论】:

      【解决方案2】:

      您是对的,该活动尚未附加。有两种方法可以解决这个问题。

      1. 在附加活动之前不要进行更改。也许只是保存 rosterItems,稍后再更新。
      2. 将上下文传递到您的更新程序函数中。

      就个人而言,我会说第一个可能是更好的路径,但任何一个都可以正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        • 1970-01-01
        • 2013-09-05
        • 1970-01-01
        • 2012-07-25
        • 2013-12-29
        • 2019-04-04
        相关资源
        最近更新 更多