Как фрагменты действия восстанавливаются при возобновлении действия? - PullRequest
2 голосов
/ 25 мая 2019

Я тестирую ситуацию, когда пользователь заходит в мое приложение после того, как система завершила процесс приложения из-за нехватки ОЗУ.Я наблюдаю неожиданное поведение и надеюсь получить некоторую помощь.

В моем приложении есть действие, позволяющее назвать его ActivityA, которое немедленно создает фрагмент Fragment A и выполняет замену фрагмента.FragmentA отображает ListView с двумя элементами в нем.Если пользователь щелкает первый элемент, создается второй фрагмент Fragment B, который заменяет FragmentA.В противном случае создается еще один FragmentA, который заменяет исходный FragmentA.Я пытаюсь создать дерево каталогов файлов.FragmentA для каталогов, FragmentB для файлов.

Допустим, пользователь нажимает на файл.Это этап теста, когда пользователь переключается на другое приложение, и система завершает процесс моего приложения из-за нехватки памяти.Затем пользователь возвращается в мое приложение, ожидая, что все останется так, как было.Однако в действительности Fragment A (родительский каталог) отображается вместо Fragment B (файл).Когда пользователь нажимает кнопку «Назад», отображается Fragment B (файл).Что я делаю не так, что приводит к тому, что система восстанавливает backstack таким образом?

Вот пример программы, которая дополнительно показывает, что делает мое приложение:

// ActivityA.java
public class ActivityA extends AppCompatActivity implements onItemClickListener
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        FragmentA fragA = new FragmentA();
        FragmentTransaction fragmentTransaction = 
            getSupportFragmentManager().beginTransaction();
        fragmentTransation.replace(R.id.basic_frame, fragA);
        fragmentTransaction.commit();
    }

    @Override
    public void onItemClick(AdapterView<?> aView, View v, int position, long id)
    {
        if (position == 0)
        {
            FragmentB fragB = new FragmentB();
            FragmentTransaction fragmentTransaction = 
                getSupportFragmentManager().beginTransaction();
            fragmentTransation.replace(R.id.basic_frame, fragB);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
        else
        {
            FragmentB fragA = new FragmentA();
            FragmentTransaction fragmentTransaction = 
                getSupportFragmentManager().beginTransaction();
            fragmentTransation.replace(R.id.basic_frame, fragA);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
    }
}

1 Ответ

2 голосов
/ 25 мая 2019

Когда вы вызываете super.onCreate(), Фрагменты автоматически восстанавливают свое текущее состояние, когда savedInstanceState не равно нулю.

Поэтому, если вы ожидаете выполнить однократную настройку, добавив свой первоначальный фрагмент, вам следуетвсегда окружайте его проверкой if (savedInstanceState == null):

@Override
public void onCreate(Bundle savedInstanceState)
{
    // I assume you accidentally left out these lines
    super.onCreate(savedInstanceState);
    setContentView(R.id.your_content_view);

    if (savedInstanceState == null) {
        FragmentA fragA = new FragmentA();
        FragmentTransaction fragmentTransaction = 
        getSupportFragmentManager().beginTransaction();
        fragmentTransation.replace(R.id.basic_frame, fragA);
        fragmentTransaction.commit();
    }
}
...