传递片段一些可变的最佳实践

时间:2014-08-14 19:54:01

标签: android android-fragments

我已经看到过两种方式,最常见的是带有参数并将其传递给这个SO答案中提到的

Android passing object to fragment

public static ConversationFragment newInstance(ArrayList<Message> _extractedMessages){    
    ConversationFragment fragment = new ConversationFragment();   

    Bundle bundle = new Bundle();
    bundle.putParcelable(KEY_MESSAGES, _extractedMessages);
    fragment.setArguments(bundle);

    return  fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    myData = getArguments().getParcelable(KEY_MESSAGES);
}

我不记得在哪里,但我也看到了另一种在我看来更优化的模式,因为它不需要任何捆绑。你能找到一个理由说明为什么我不应该使用这种模式吗?

   public static ConversationFragment newInstance(ArrayList<Message> _extractedMessages){    
        ConversationFragment fragment = new ConversationFragment();   
        fragment.myData = _extractedMessages;        
        return  fragment;
    }

    ArrayList<Message> myData;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

2 个答案:

答案 0 :(得分:3)

来自文档的

setArguments(Bundle bundle)

  

提供此片段的构造参数。这只能是   在片段附加到其活动之前调用;那是,   你应该在构造片段后立即调用它。的的   这里提供的参数将保留在片段destroy和   创建

因此,如果您的片段被Android销毁并重新创建(由于某种原因),如果您使用setArguments(),您将能够保留您的数据。

答案 1 :(得分:0)

变量的名称,告知您正在尝试为ConversationFragment提供消息列表。第一种方法是将大量数据捆绑在一起是个坏主意。 (因为束大小限制为500k(或1Mb))。我建议您从ConversationFragment本身的数据源(通常是数据库)中提取数据。如果您使用数据库,强烈建议使用ContentProviderCursorLoader非常好,特别是您要将数据加载到listview中。但是一开始使用ContentProvider有点棘手。