2016-09-26 1 views
0

Все, что я хочу, - это выйти из приложения, только если пустой стек пуст.Дважды нажмите кнопку возврата, чтобы выйти из приложения с некоторым условием

В одной части моего приложения есть галерея, в которой при щелчке изображения открывается фрагмент, показывающий полноэкранное изображение. Когда на этом полноэкранном изображении нажата кнопка «Назад», я хочу вернуться к фрагменту галереи. Я сделал это, добавив фрагмент обратно в стек.

Но в других частях приложения, когда нажата кнопка «Назад», я хочу показать тост «Пожалуйста, снова нажмите« НАЗАД », чтобы выйти». И когда кнопка назад снова нажата, приложение закрывается. Как я могу это сделать?

Это то, что я сделал до сих пор:

boolean doubleBackToExitPressedOnce = false; 
@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0){ 
     getFragmentManager().popBackStack(); 
    } else { 

     if (doubleBackToExitPressedOnce) { 
      super.onBackPressed(); 
      return; 
     } 

     this.doubleBackToExitPressedOnce = true; 
     commonTasks.ShowStringMessage("Please click BACK again to exit"); 

     new Handler().postDelayed(new Runnable() { 

      @Override 
      public void run() { 
       doubleBackToExitPressedOnce=false; 
      } 
     }, 2000); 

     //super.onBackPressed(); 
    } 
} 

Очевидно, что это не сработало.

+0

Пожалуйста, подтвердите, добавляете ли вы свои фрагменты в backstack с помощью getFragmentManager() или getSupportFragmentManager() – Nitesh

+0

@Nitesh: getFragmentManager(). Вы можете помочь? –

+0

ваш код отлично выглядит для меня .. можете ли вы рассказать, что происходит, когда вы нажимаете кнопку «Назад»? – Nitesh

ответ

0

Вы можете попробовать использовать getSupportFragmentManager()

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

boolean doubleBackToExitPressedOnce = false; 
@Override 
public void onBackPressed() { 
if (getSupportFragmentManager().getFragments().size() > 0){ 
    getSupportFragmentManager().popBackStack(); 
} else { 

    if (doubleBackToExitPressedOnce) { 
     super.onBackPressed(); 
     return; 
    } 

    this.doubleBackToExitPressedOnce = true; 
    commonTasks.ShowStringMessage("Please click BACK again to exit"); 

    new Handler().postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      doubleBackToExitPressedOnce=false; 
     } 
    }, 2000); 

    //super.onBackPressed(); 
} 

}

PS: вам также необходимо изменить getSupportFragmentManager(), в то время как фрагмент фрагментации.

Также Reffer этой ссылке Why FragmentManager's getBackStackEntryCount() return zero?

+0

Позвольте мне проверить, работает ли это –

+0

Теперь он даже не показывает сообщение с тостами. Приложение закрывается при первой обратной кнопке –

+0

sry my bad ..обновляю свой ответ – Nitesh

0

Вы можете попробовать что-то диф. Добавьте код выхода в свой метод активности onBackPressed и всякий раз, когда вы получаете триггер onBackPressed. Просто проверьте, активен ли ваш Фрагмент галереи? , если он затем выдает код выхода еще. Измените фрагмент.

//define as field variable 
private boolean doubleBackToExit = false; 

MyGalleryFragment myFragment = (MyGalleryFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT"); 
if (myFragment != null && myFragment.isVisible()) { 

    if (doubleBackToExit) { 
     super.onBackPressed(); 
     finishAffinity(); 
     return; 
    } 
    this.doubleBackToExit = true; 
    toastMsg(getResources().getString(R.string.touch_again_to_exit)); 

    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      doubleBackToExit = false; 
     } 
    }, 2000); 
} else { 
    //Change Layout/Fragment 
} 

Просто не забудьте добавить тег в Fragment ...

fragTrans.replace(android.R.id.content, myFragment, "MY_FRAGMENT"); 

Надеется, что это будет работать ..!

+0

Это не работает –

+0

Вы добавили тег с фрагментом? и добавил в действие этот код? –

+0

Да, да. Но я получал ошибку в строке: «MyGalleryFragment myFragment = (MyGalleryFragment) getFragmentManager(). FindFragmentByTag (« MY_FRAGMENT »); Итак, я сделал что-то вроде этого: «Фрагмент myFragment = getFragmentManager(). FindFragmentByTag (« a »); –

0

Попробуйте использовать

super.onBackPressed(); 

вместо

getFragmentManager().popBackStack(); 

и дайте нам знать о результатах.

+0

Тот же результат. Проблема в том, что управление всегда попадает в раздел else. Даже после добавления фрагмента в задний стек. т.е. даже после (getFragmentManager(). getBackStackEntryCount()> 0) является ложным. Любая идея, что происходит? –

+0

Какую деятельность вы используете? Это AppCompatActivity или FragmentActivity? –

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