0

Привет, я создал проект с по умолчанию «Активность навигационного ящика». Итак, у меня есть MainActivity с фрагментом, который заменяется на каждый элемент меню.Фрагмент, вызывающий фрагменты, теряющие состояние при повороте экрана

Одним из меню является «Клиенты» с отображением списка клиентов.

Из фрагмента клиента я могу видеть интересы этих клиентов, с Фрагментом (CustomerListFragment), вызывающим интересы (InterestListFragment).

Существует еще больше уровней, но этого недостаточно.

Это код на MainActivity, что я использовать для вызова фрагмент из фрагмента и передавать данные между

public void passData(Object[] data, Fragment f) { 
    Bundle args = new Bundle(); 
    args.putSerializable("PASSED_DATA", data); 
    f.setArguments(args); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction() 
      .replace(R.id.container, f) 
      .addToBackStack("") 
      .commit(); 
} 

И я использую как:

mCallbacks.passData(new Object[]{c}, new OpportunityListFragment()); 

Проблема в том, что, когда я повернуть телефон не имеет значения, с какого уровня активности у меня есть, он возвращается к первому фрагменту (CustomerListFragment), и если я нажимаю «Назад» на сотовый телефон, он возвращается туда, где я был, когда вращаю телефон.

Что мне нужно делать, чтобы избежать такой проблемы? почему он возвращается к первой активности, вызванной, если я заменяю фрагменты?

ответ

4

Ответ от ste-fu правильный, но давайте исследуем программно. В документации Google есть хороший рабочий код @Handling Runtime Changes. Есть два фрагмента кода, которые вам нужно сделать.

1) Фрагмент кода:

public class MyActivity extends Activity { 

private RetainedFragment dataFragment; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // find the retained fragment on activity restarts 
    FragmentManager fm = getFragmentManager(); 
    dataFragment = (DataFragment) fm.findFragmentByTag(“data”); 

    // create the fragment and data the first time 
    if (dataFragment == null) { 

Примечание: Код использует FragmentManager найти текущий фрагмент. Если фрагмент имеет значение NULL, пользовательский интерфейс или приложение не были выполнены. если не null, то вы можете получить данные от RetainedFragment объект.

2) Необходимо сохранить состояние фрагмента.

public class RetainedFragment extends Fragment { 

// data object we want to retain 
private MyDataObject data; 

// this method is only called once for this fragment 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // retain this fragment 
    setRetainInstance(true); 
} 

Примечание: setRetainInstance используется в OnCreate. И подклассификация Фрагмента рекомендуется, называя его RetainedFragment, используемый на фрагменте 1.

1

При изменении ориентации экрана ваша родительская активность уничтожается и воссоздается. Если вы не сохраните структуру уровня каким-то образом, она всегда будет выглядеть так, как только вы начали свою деятельность. Вы можете использовать объект bundle или для более сложных объектов, которые необходимо сохранить в базе данных.

В любом случае, onSaveInstanceState - ваш друг. Затем в вашем методе onCreate вам нужно проверить комплект или базу данных, а также установить соответствующий фрагмент.

+0

Я попробую решение, спасибо. –

Смежные вопросы