ВОТ

тоящее время я тестирую свое приложение с мультипаномFragmentвид с использованием пакета совместимости с HC и много трудностей с изменением ориентации.

мойHost активность имеет 2 панели в ландшафте (menuFrame а такжеcontentFrame), и толькоmenuFrame на портрете, в который загружаются соответствующие фрагменты. Если у меня есть что-то в обеих панелях, но затем изменить ориентацию на портрет, я получаю NPE, поскольку он пытается загрузить представления во фрагменте, который будет в (не существует)contentFrame, С помощьюsetRetainState() метод во фрагменте контента не работал. Как я могу разобраться, чтобы система не загружала фрагмент, который не будет показан?

Большое спасибо!

Ответы на вопрос(3)

contentFrame для портрета и в вашей деятельности только загрузитьmenuFrame если значение элемента saveInstanceState равно нулю, фрагменты содержимого будут отображаться при изменении ориентации.

Хотя не идеально, так как если вы нажмете кнопку «Назад» (столько раз, сколько необходимо), вы никогда не увидите фрагмент меню, так как он не был загружен вcontentFrame.

Жаль, что демонстрации API FragmentLayout не сохраняют правильное состояние фрагмента при изменении ориентации. Независимо от того, что я обдумал эту проблему и попробовал разные вещи, я не уверен, что есть прямой ответ. Лучший ответ, который я придумала до сих пор (не проверено), это иметь одинаковое расположение в портретной и альбомной ориентации, но скрытьmenuFrame когда что-то есть вdetailsFrame, Точно так же покажи и спрячьframeLayout когда последний пуст.

Создать новый экземпляр только в первый раз.

Это делает трюк:
Создайте новый экземпляр фрагмента, когда действие начнется в первый раз, а затем повторно используйте старый фрагмент.
Как ты можешь это сделать?
FragmentManager это ключ

Вот фрагмент кода:

if(savedInstanceState==null) {
    userFragment = UserNameFragment.newInstance();
    fragmentManager.beginTransaction().add(R.id.profile, userFragment, "TAG").commit();
}
else {
    userFragment = fragmentManager.findFragmentByTag("TAG");
}

Сохранить данные на стороне фрагмента

Если у вашего фрагмента есть EditText, TextViews или любые другие переменные класса, которые вы хотите сохранить при изменении ориентации. Сохрани этоonSaveInstanceState() и получить их вonCreateView() метод

Вот фрагмент кода:

// Saving State

@Override
public void onSaveInstanceState(Bundle outState) {
     super.onSaveInstanceState(outState);
     outState.putString("USER_NAME", username.getText().toString());
     outState.putString("PASSWORD", password.getText().toString());
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {

     View view = inflater.inflate(R.layout.user_name_fragment, parent, false);

     username = (EditText) view.findViewById(R.id.username);
     password = (EditText) view.findViewById(R.id.password);


     // Retriving value

     if (savedInstanceState != null) {
         username.setText(savedInstanceState.getString("USER_NAME"));
         password.setText(savedInstanceState.getString("PASSWORD"));
     }

     return view;
}

Вы можете увидеть полный рабочий кодВОТ

Решение Вопроса

Кажется, чтоonCreateViewMethod вызывал проблемы; он должен возвратить нуль, если контейнер нуль:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {   
    if (container == null) // must put this in
        return null;
    return inflater.inflate(R.layout.<layout>, container, false);
}
 prettyvoid20 окт. 2014 г., 21:56
Я согласен с Марти
 Marty Miller16 июл. 2014 г., 09:30
это не избавиться от фрагмента, хотя. Это просто предотвращает его отрисовку. Это все еще в памяти, и вы будете дублировать свои фрагменты каждый раз, когда вы поворачиваете.

Ваш ответ на вопрос