首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在片段中保存和还原数据

在片段中保存和还原数据
EN

Stack Overflow用户
提问于 2013-08-29 16:06:13
回答 1查看 1.5K关注 0票数 2

我有一个ListFragment,我想使用onSaveInstanceState保存它的数据,然后在onCreateView中恢复它,但是发生了一些奇怪的事情。

我使用这段代码保存数据:

代码语言:javascript
复制
private ArrayList<TuplaFacturaWS> facturas;

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    System.out.println("save");

    //TuplaUsuario.usuario
    savedInstanceState.putString("usuario", myApplication.getUsuarioActual().getUsuario());
    //TuplaUsuario.password
    savedInstanceState.putString("password", myApplication.getUsuarioActual().getPassword());
    //TuplaUsuario.cups
    ArrayList<TuplaCupsWS> arrayCups = myApplication.getUsuarioActual().getCups();
    savedInstanceState.putInt("numCups", arrayCups.size());
    for(int cups = 0; cups < arrayCups.size(); cups++) {
        //TuplaUsuario.cups.CUPS, TuplaUsuario.cups.Tarifa, TuplaUsuario.cups.Direccion
        savedInstanceState.putString("cups"+cups, arrayCups.get(cups).getCups());
        savedInstanceState.putString("tarifa"+cups, arrayCups.get(cups).getTarifa());
        savedInstanceState.putString("direccion"+cups, arrayCups.get(cups).getDireccion());
        //TuplaUsuario.cups.facturas
        System.out.println("N facturas on save: "+arrayCups.get(cups).getFacturas().size());
        ArrayList<TuplaFacturaWS> arrayFacturas = arrayCups.get(cups).getFacturas();
        savedInstanceState.putInt("numFacturas"+cups, arrayFacturas.size());
        for(int factura = 0; factura < arrayFacturas.size(); factura++) {
            savedInstanceState.putString("factura"+factura,
                    arrayFacturas.get(factura).getFactura());
            savedInstanceState.putDouble("importe"+factura, 
                    arrayFacturas.get(factura).getImporte());
            savedInstanceState.putLong("fecha"+factura, 
                    arrayFacturas.get(factura).getFecha().getTime());
            savedInstanceState.putString("plan"+factura,    
                    arrayFacturas.get(factura).getPlan());
            savedInstanceState.putString("estado"+factura,  
                    arrayFacturas.get(factura).getEstado());
            savedInstanceState.putString("pdf"+factura, 
                    arrayFacturas.get(factura).getPdf());
            savedInstanceState.putString("anexo"+factura,   
                    arrayFacturas.get(factura).getAnexo());
        }
    }
    //TuplaUsuario.cupsActual
    savedInstanceState.putInt("cupsActual", myApplication.getUsuarioActual().getCupsActual());
}

情景1

代码语言:javascript
复制
public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.activity_facturas, container, false);
    // Get the application instance
    myApplication = (MyApplication)getActivity().getApplication();
    facturas = myApplication.getFacturas();

    System.out.println("num facturas on create view: "+facturas.size());

    //...
}

所发生的是:

  • 当首次加载视图时,视图显示5个"facturas“。onCreateView在创建视图上打印"num : 5“。
  • 当更改方向时,视图显示相同的5 "facturas“。onSaveInstanceState在保存:5上打印"N facturas“,onCreateView在create视图上打印"num facturas : 5”。->它是正确的。
  • 当再次更改方向时,视图将不显示"factura“。onSaveInstanceState在保存:0上打印"N facturas“,onCreateView在create视图上打印"num : 0”。->,这是错误的。

情景2

代码语言:javascript
复制
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.activity_facturas, container, false);
    // Get the application instance
    myApplication = (MyApplication)getActivity().getApplication();

    if (savedInstanceState != null) {
            System.out.println("bundle not null");
            myApplication.nuevoUsuarioActual();
            //TuplaUsuario.usuario
            myApplication.getUsuarioActual().setUsuario(savedInstanceState.getString("usuario"));
            //TuplaUsuario.password
            myApplication.getUsuarioActual().setPassword(savedInstanceState.getString("password"));
            //TuplaUsuario.cups
            ArrayList<TuplaCupsWS> arrayCups = new ArrayList<TuplaCupsWS>();
            int numCups = savedInstanceState.getInt("numCups");
            for(int cups = 0; cups < numCups; cups++) {
                TuplaCupsWS tuplaCups = new TuplaCupsWS();
                //TuplaUsuario.cups.CUPS, TuplaUsuario.cups.Tarifa, TuplaUsuario.cups.Direccion
                tuplaCups.setCups(savedInstanceState.getString("cups"+cups));
                tuplaCups.setTarifa(savedInstanceState.getString("tarifa"+cups));
                tuplaCups.setDireccion(savedInstanceState.getString("direccion"+cups));
                //TuplaUsuario.cups.facturas
                ArrayList<TuplaFacturaWS> arrayFacturas = new ArrayList<TuplaFacturaWS>();
            int numFacturas = savedInstanceState.getInt("numFacturas"+cups);
            System.out.println("n facturas: "+numFacturas);
            for(int factura = 0; factura < numFacturas; factura++) {

                TuplaFacturaWS tuplaFactura = new TuplaFacturaWS();
                tuplaFactura.setFactura(savedInstanceState.getString("factura"+factura));
                tuplaFactura.setImporte(savedInstanceState.getDouble("importe"+factura));
                tuplaFactura.setFecha(new Date(savedInstanceState.getLong("fecha"+factura)));
                tuplaFactura.setPlan(savedInstanceState.getString("plan"+factura));
                tuplaFactura.setEstado(savedInstanceState.getString("estado"+factura));
                tuplaFactura.setPdf(savedInstanceState.getString("pdf"+factura));
                tuplaFactura.setAnexo(savedInstanceState.getString("anexo"+factura));
                arrayFacturas.add(tuplaFactura);

            }
                tuplaCups.setFacturas(arrayFacturas);
                arrayCups.add(tuplaCups);
            }
            myApplication.getUsuarioActual().setCups(arrayCups);
            //TuplaUsuario.cupsActual
            myApplication.getUsuarioActual().setCupsActual(
                    savedInstanceState.getInt("cupsActual"));

    }

    facturas = myApplication.getFacturas();

    System.out.println("num facturas on create view: "+facturas.size());

    //...
}

在这种情况下,所发生的是:

  • 当首次加载视图时,视图显示5个"facturas“。onCreateView在创建视图上打印"num : 5“。
  • 当更改方向时,视图显示相同的5 "facturas“。onSaveInstanceState在保存上打印"n facturas: 5",Bundle不为null,onCreateView打印"N facturas : 0“和"num facturas on create view: 0”。->,这是错误的。
  • 当再次改变方向时,也会发生同样的情况。

如果我加上

代码语言:javascript
复制
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

与情况1相同。

我找不到问题出在哪里。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-29 17:38:48

我看到您在onCreateView()中调用这个onCreateView,但我看不到在onSaveInstanceState()中设置该值的位置。

这将导致numFacturas = 0,因此永远不会进入循环填充数组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18515886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档