Состояние сохраненного фрагмента ВСЕГДА равно нулю

#android #android-fragments

#Android #android-фрагменты

Вопрос:

Я статически создал фрагмент (через 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, объявленный в моем основном activity 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"
    />
  

Как вы можете видеть
— Я НЕ установил setRetainInstance (true) в своем классе Fragment и
— Мой фрагмент XML имеет связанный с ним идентификатор
android:id="@ id/fragment_distancesetter

Комментарии:

1. Вызывается ли onSaveInstanceState? Вы видите свой журнал «Экономия расстояния …)

2. Да — вызывается onSaveInstanceState

Ответ №1:

У меня только что была такая же проблема, и это сводило меня с ума, но, как оказалось, фрагмент просто повторно добавлялся в действие при каждом вращении. Вы не добавили код своей активности, но, возможно, захотите проверить, что это не так, поскольку это легко упустить из виду и объясняет вашу проблему.

Ответ №2:

Когда вы статически помещаете фрагмент в действие, менеджер фрагментов всегда создает новый фрагмент и присоединяет его к действию. Метод restoreInstanceState() никогда не будет вызван. Если вы хотите это сделать, вы можете сохранить состояние в методе восстановления вашей активности и поместить состояние сохранения вашей активности в свой фрагмент. Или создайте фрагмент динамически.