片段状态损失?

时间:2014-11-06 18:38:08

标签: android android-fragments

究竟什么是“国家损失”情况?你能展示一个完整的场景(包括一些代码)会导致它吗? 我已经阅读了许多关于该主题的教程(官方和非官方),博客,stackoverflow问题/答案,但从来没有这样的例子会导致实际的状态损失以及状态丢失发生后的实际情况。

我不知道为了造成国家损失所做的全部步骤。 我试图做的是:

  1. 具有包含框架布局的布局的活动。
  2. 在某些TextView中具有“hello”文本的布局的片段。
  3. 将Fragment添加片段事务到上面的帧布局。
  4. 用户按下主页按钮,然后发生使用commitAllowingStateLoss()方法提交的片段事务的方案。
  5. 然后我尝试进行配置更改,但一切都很好。 然后我试图从后台恢复,但一切都很好。 然后我尝试将片段添加到后台堆栈并执行commitAllowingStateLoss() 然后是上面的步骤,但是当配置发生变化或者我从后台返回时,然后我按下后退按钮确实删除了事务,这意味着从后栈中删除片段,这意味着不会发生状态丢失。

    那究竟是什么'国家损失'?它如何影响用户在屏幕上看到的内容。 你能展示一个完整的州损失情景吗?

    编辑:输入一些测试代码:

    活动代码:

    package com.example.statelosstest;
    
    import android.app.Activity;
    import android.app.FragmentTransaction;
    import android.os.Bundle;
    import android.os.Handler;
    
    public class MainActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    }
    
    @Override
    protected void onStop() {
        super.onStop();
    
        //Just for test
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
    
            @Override
            public void run() {
                addDummyFragment();             
            }
        }, 5000);
    }
    
    /**
     * Invoke this method after onSaveInstanceState has been called,
     * for example after user press android home button.
     */
    private void addDummyFragment(){
        DummyFragment frag = new DummyFragment();
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.add(R.id.fragment_frame, frag, frag.getClass().getName());
    
        // tried this also
        // transaction.addToBackStack(frag.getClass().getName());
    
        transaction.commitAllowingStateLoss();
    }
    
    }
    

    编辑:仍然没有回答 -
    我试图模拟我认为会导致状态丢失的事情,并且我会在UI中看到状态丢失,但无法模拟或导致任何状态丢失情况。请有人可以显示状态丢失发生的情况,并且可以在UI中看到,这意味着状态丢失确实发生了真正发生的意外行为。

1 个答案:

答案 0 :(得分:3)

一些州损失示例:

1。假设你有一个按钮和一个textview。在代码中,你已经定义了具有初始值0的整数i,其通过cicking按钮递增1并且其值显示在textview中。假设你已经按了5次按钮,那么textview将被设置为0.那就是整数在屏幕更改时丢失了它的值

解决方案:覆盖onSaveInstanceState并输入整数值。然后在onResume或onCreate方法中保留该整数的值。

2。考虑你有一个待办事项列表视图。用户动态添加到该列表视图中的dos。假设用户已添加3个项目,然后在屏幕上旋转(或者如果应用程序重新启动),则列表视图将变为空。

解决方案:再次在onSaveInstanceState中,放入ArrayList。 (列表可以实现为" Serializabe"或" Parcelable"并且可以作为一个整体存储。您不需要存储listview的每个项目)。然后在onResume或onCreate方法中,获取listview。

3. 屏幕旋转时,屏幕上的所有edittexts都将变为空。

我对简单语言中的状态损失的理解是,无论何时配置更改(屏幕旋转或应用程序重新启动),都会调用活动的整个生命周期。所以,没有保存的任何东西都会丢失。

这让我想起任天堂的退出屏幕消息,"任何未保存的内容都将丢失"。