2015-05-14 5 views
0

У меня есть активность с двумя осколками (Список & Подробности), в OnCreate(), я начинаю список фрагмент, если savedInstance равно нуль, как такPopbackstack Завершает активность в OnBackPressed

public static final int CLIENT_LIST_FRAGMENT = 1; 
public static final int CLIENT_DETAILS_FRAGMENT = 2; 
private int currentFragment = 0; 

if (savedInstanceState == null) { 
      //On first run, start the list fragment 
      if (currentFragment == 0) { 
       ClientListFragment listFrag = new ClientListFragment(); 
       getSupportFragmentManager().beginTransaction() 
         .add(R.id.container_client, listFrag, Constants.CLIENT_LIST_FRAGMENT_TAG) 
         .commit(); 
       currentFragment = CLIENT_LIST_FRAGMENT; 
      } else { 
       switch (currentFragment) { 
        case CLIENT_LIST_FRAGMENT: 
         addListFragment(); 
         break; 
        case CLIENT_DETAILS_FRAGMENT: 
         addDetailsFragment(0); 
         break; 
       } 
      } 
     } 

А вот метод, который добавить DetailsFragment и ListFragment по мере необходимости

private void addListFragment(){ 
     ClientDetailsFragment listFrag = new ClientDetailsFragment(); 
     getSupportFragmentManager().beginTransaction() 
       .replace(R.id.container_client, listFrag, Constants.CLIENT_LIST_FRAGMENT_TAG) 
       .addToBackStack("details") 
       .commit(); 
     currentFragment = CLIENT_LIST_FRAGMENT; 
    } 

    private void addDetailsFragment(long companyId){ 
     ClientDetailsFragment detailsFrag = ClientDetailsFragment.newInstance(companyId); 
     getSupportFragmentManager().beginTransaction() 
       .replace(R.id.container_client, detailsFrag, Constants.CLIENT_DETAILS_TAG) 
       .addToBackStack(null) 
       .commit(); 
     currentFragment = CLIENT_DETAILS_FRAGMENT; 

    } 

Это работает, как ожидается, за исключением того, что, когда я нажимаю кнопку назад от Подробности фрагмента, вместо того, чтобы меня обратно к списку фрагмента, он фактически завершает активность. Он возвращается к фрагменту списка за долю секунды, а затем завершает работу с хостом и возвращается к вызывающей активности. Как я могу остановить это поведение, пройдя через множество связанных onBackpress вопрос о SO вот мой overide из onBackPressed

@Override 
    public void onBackPressed() { 
     if (currentFragment == CLIENT_DETAILS_FRAGMENT){ 
      getSupportFragmentManager().popBackStackImmediate(); 
     }else { 
      super.onBackPressed(); 
     } 
    } 

Благодарности

ответ

1

Я обычно проверить, принадлежит ли текущий экземпляр фрагмента к фрагменту, который вызывается onBackPressed(). Этот код не проверен; это просто дать вам представление о том, как действовать дальше. Надеюсь, вы не звоните this.finish() на этом Activity.

@Override 
public void onBackPressed() { 
    Fragment fragment = getSuportFragmentManager().findFragmentByTag(Constants.CLIENT_DETAILS_TAG); 
    if (fragment instanceof ClientDetailsFragment) { 
     getSupportFragmentManager().popBackStackImmediate(); 
    } 
    else { 
     super.onBackPressed(); 
    } 
} 

Сообщите мне, если это поможет.

+0

Спасибо и я попробую свой код в немного, я устранить тот факт, что OnDestroy не будет вызван независимо от того, как я справилась с onbackpressed поэтому моя задача сейчас, чтобы выяснить, как остановить OnDestroy от призыва, когда I onBackpressed называется –

+0

Ну, это означает, что 'this.finish()' вызывается _application_ или _system_ ** (этот экземпляр действия уничтожается, чтобы сэкономить место) ** [Проверить документацию] (http://developer.android.com/reference/android/app/Activity.html). – Prince

+1

Хм, на простом приложении. Спасибо, я пытаюсь понять, как это предотвратить. Спасибо за ваш код, он указывает мне в правильном направлении. –

0

Господи, я гонялся за неправильной тенью в течение двух дней. Я слушал, обрабатывал и переопределял неправильное событие.

Этот SO вопрос спас меня Why is onBackPressed() not being called?

И суть в «onBackPressed() вызывается, когда пользователь нажимает на аппаратной назад кнопку (или кнопку на панели навигации„вверх“), а не кнопки в панели действий. Для этого вам нужно переопределить метод onOptionsItemSelected(). Пример: «

Я поймал это событие фрагментом и вызвал getActivity.onBackpressed. Когда я остановил это, мне стало очевидно, что onBackPressed не вызывается. Вот мое решение, не может быть оптимальным, но она работает

if (item.getItemId() == android.R.id.home){ 
      if (currentFragment == CLIENT_DETAILS_FRAGMENT){ 
       getSupportFragmentManager().popBackStackImmediate(); 
       currentFragment = CLIENT_LIST_FRAGMENT; 
       return true; 
      } 
     } 
0
if (currentFragment == 0) { 
      ClientListFragment listFrag = new ClientListFragment(); 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.container_client, listFrag, Constants.CLIENT_LIST_FRAGMENT_TAG) 
        .commit(); 
      currentFragment = CLIENT_LIST_FRAGMENT; 
     } 

при изменении этого добавить в addToBackStack()

и изменения onBackPressed(), как,

@Override 
public void onBackPressed() { 
if (getFragmentManager().getBackStackEntryCount() == 1) { 
    MainActivity.this.finish(); 
} 
else { 
    getFragmentManager().popBackStack(); 
    } 
} 

Надеюсь, это сработает.

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