2013-12-16 2 views
0

У меня проблема с навигацией в моем приложении. У меня есть два вида деятельности: MainActivity и FormActivity. Основной вид деятельности имеет компоновку ящика, в зависимости от выбранного элемента он загружает фрагмент:MainActivity вызывает onDestroy при навигации вверх

private void selectItem (int position) { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager 
      .beginTransaction(); 

    Fragment fragment = null; 
    previousNavigationItem = position; 

    switch (position) 
    { 
     case DASHBOARD_FRAGMENT: 
      fragment = new DashboardFragment(); 
      mTitle = getResources().getString(R.string.title_dashboard); 
      break; 
     case LIST1_FRAGMENT: 
      fragment = new ListFragment(); 
      mTitle = getResources().getString(R.string.title_list1); 
      break; 

     case LIST2_FRAGMENT: 
      fragment = new ListFragment(); 
      mTitle = getResources().getString(R.string.title_list2); 
      break; 

     default: 
      Log.w(AppController.ERROR_TAG, "Index out of bounds in changeFragment"); 
    } 

    if (fragmentTransaction != null && fragment!=null) { 
     fragment.setRetainInstance(true); 
     fragmentTransaction.replace(R.id.content_frame, fragment); 
     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 
    } 
} 

ListFragment загружает ListView с некоторых строк, когда один элемент выбран он начинает новый FormActivity:

protected void startForm(FormActivity.FORM_ACTION action, String dataClass, int groupPosition, long groupId) { 
    Intent data = new Intent(getActivity(), FormActivity.class); 
    data.setAction(action.toString()); 
    data.putExtra(FormActivity.BUNDLE_KEY_GROUP_POSITION, groupPosition); 
    data.putExtra(FormActivity.BUNDLE_KEY_FORM_CLASS, dataClass); 
    data.putExtra(FormActivity.BUNDLE_KEY_GROUP_ID, groupId); 
    startActivityForResult(data, FormActivity.FORM_REQUEST_CODE); 
} 

в FormActivity:

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

    setContentView(R.layout.activity_form); 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager 
      .beginTransaction(); 

    Fragment fragment = null; 
    try { 
     (...I do some casting here but nothing to do with the problem..) 
     fragment = new FormFragment(); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

    if (fragmentTransaction != null && fragment!=null) 
     fragmentTransaction.replace(R.id.form_frame, fragment).commit(); 

} 

Все работает, как ожидалось, за исключением, когда я вернуться обратно с помощью кнопки HomeUp, MainActivity, уничтожается затем воссоздан снова, и са vedInstance не сохраняется.

Я прочитал всю документацию от разработчиков Android, но до сих пор не нашел преступника.

Edit:

В MainActivity

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    Log.d(AppController.DEBUG_TAG, "MainActivity onRestoreInstanceState"); 
    super.onRestoreInstanceState(savedInstanceState); 
    // Restore the previously serialized current dropdown position. 
    if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) { 
     getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM)); 
    } 

} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    Log.d(AppController.DEBUG_TAG, "MainActivity onSaveInstanceState"); 
    super.onSaveInstanceState(outState); 
    // Serialize the current dropdown position. 
    outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, 
      getSupportActionBar().getSelectedNavigationIndex()); 
    Log.d(AppController.DEBUG_TAG, "Selected item id in Navigation Drawer: " + mDrawerList.getSelectedItemId()); 
} 
+0

Проверьте это. http://stackoverflow.com/a/16426803/832749 –

+0

@Siddharth, спасибо за ваш ответ, я проверил варианты dev и «Do not keep activities» дезактивирован. – spacebiker

ответ

1

Смотреть это:

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

В принципе может быть несколько мероприятий одного и того же вида происходит в любой момент времени.

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

EDIT:

Ok, я, кажется, есть неправильно что-то понял.

Для этого вам необходимо использовать SharedPreferences или какой-либо другой метод устойчивости. Если андроид полностью закрывает ваше приложение, ваши ресурсы savedInstance, скорее всего, будут выпущены.

Общие предпочтения очень стандартный способ делать послесвечения и работает очень хорошо ...

См:

http://developer.android.com/guide/topics/data/data-storage.html#pref

+0

Я уже прочитал эти документы, но вопрос в том, как я могу сохранить предыдущее состояние из пакета, если пакет снова воссоздается? Я редактировал свой вопрос, добавляя (ранее в моем коде) переопределения onRestoreInstanceState и onSaveInstanceState. – spacebiker

+0

Вы уверены? Здесь я не вижу onSaveInstanceState. –

+0

просто добавил после написания комментария, он должен быть там теперь, если вы обновите – spacebiker

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