片段savedInstanceState始终为null

时间:2014-07-01 07:54:28

标签: android android-fragments

我已静态创建了一个片段(通过XML)。我试图将最后显示的值存储在一个包中,并在下次启动应用程序时显示它。但是我无法让它发挥作用。出于某种原因,savedInstanceState始终为空。

public class DistanceSetterFragment extends Fragment implements SharedPreferences.OnSharedPreferenceChangeListener { 
    Distance distance = new Distance();

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

        if (savedInstanceState!=null )
        {
            Log.d(this.getClass().getName(),"onCreate savedInstanceState is NOT null");

        }
        else
        {
            Log.d(this.getClass().getName(),"onCreate savedInstanceState is null");
        }


    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        Log.d(this.getClass().getName(),"Distance "+distance);


        if (savedInstanceState!=null )
        {
            Log.d(this.getClass().getName(),"onCreateView savedInstanceState is NOT null");

        }
        else
        {
            Log.d(this.getClass().getName(),"onCreateView savedInstanceState is null");
        }


        return inflater.inflate(R.layout.fragment_distancesetter, container, false);
    }



    @Override
    public void onSaveInstanceState(Bundle outState) 
    {
        super.onSaveInstanceState(outState);

        if (distance!=null) {
            Log.d(this.getClass().getName(),"Saving DISTANCE_BEAN "+distance);
            outState.putSerializable(Constants.DISTANCE_BEAN, distance);
        }
        else
        {
            Log.d(this.getClass().getName(),"Distance BEAN IS NULL");

        }

        outState.putString("", "");

    }
}

下面是我的主要活动XML

中声明的片段XML
<fragment
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/fragment_distancesetter"
    android:layout_below="@id/img_logo_main"
    android:name="com.webconfs.xyz.fragments.DistanceSetterFragment"
    android:layout_marginLeft="4dp"
    android:layout_marginRight="4dp"
    />

如你所见 - 我没有在Fragment类中设置setRetainInstance(true) - 我的片段XML有一个与之关联的ID         android:id="@+id/fragment_distancesetter

2 个答案:

答案 0 :(得分:1)

我刚才遇到了同样的问题而且它让我发疯了,但事实证明,片段只是在每次旋转时都被重新添加到活动中。您没有添加您的活动代码,但您可能希望检查不是这种情况,因为它很容易被忽视,并会解释您的问题。

答案 1 :(得分:0)

当您将片段静态放入活动时,片段管理器将始终创建一个新片段并将其附加到活动。永远不会调用restoreInstanceState()方法。如果您想这样做,可以在活动的恢复方法中保存状态,并将活动的保存状态放入您的片段。或者动态创建片段。