2014-11-19 2 views
1

В настоящее время я использую фрагмент с Backstack. В одном из фрагментов, например «» Меню «» «Я хотел вызвать подсказку, когда пользователь нажал кнопку« Назад ». Но у меня есть некоторые проблемы в достижении этого. Я перечислил два сценария ниже, которые я пробовал.Android Fragment onBackPressed display alertDialog

Сценарий 1:

Я добавил KeyListener в "меню" фрагмент, который срабатывает, когда пользователь постучал по задней кнопки.

Я добавляю еще один фрагмент сверху "Меню" под названием "Report". Когда я нажал кнопку «Report», фрагмент все равно запросит предупреждениеDialog, которое используется в «Menu». KeyListener по-прежнему активен в фоновом режиме.

Меню Фрагмент

rootView.setFocusableInTouchMode(true); 
    rootView.requestFocus(); 
    rootView.setOnKeyListener(new View.OnKeyListener() { 
      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 

       if (event.getAction()!=KeyEvent.ACTION_DOWN) 
        return true; 

        switch (keyCode) { 
        case KeyEvent.KEYCODE_BACK : 
         Log.i("Menu", "onKey Back listener is working!!!"); 
         new AlertDialog.Builder(getActivity()) 
         .setTitle("Information") 
         .setMessage("Do you wish to exit from Menu Screen?") 
         .setNegativeButton("No", null) 
         .setPositiveButton("Yes", 
           new DialogInterface.OnClickListener() { 
            @Override 
            public void onClick(DialogInterface dialog, int id) { 

             ((MainActivity)getActivity()).selectItem(0, true); 
            } 
           }).create().show(); 
         break; 
        } 

        return true; 
      } 
     }); 

Сценарий 2:

Использование onBackPressed метод на MainActivity класса. Это вызовет alertDialog в «Menu» фрагмент. Но в тот момент, когда он запрашивает alertDialog, этот фрагмент будет автоматически завершен, несмотря на то, что пользователю еще предстоит выбрать любую опцию alertDialog. Это может быть вызвано этим кодом getFragmentManager().addOnBackStackChangedListener(getListener());. Но я не могу удалить этот код, поскольку он мне нужен для других фрагментов.

MainActivity.class

@Override 
public void onBackPressed() { 
    FragmentManager manager = getFragmentManager(); 
    if (manager != null) { 
     int backStackEntryCount = manager.getBackStackEntryCount(); 
     Log.i(TAG, "backstackcount :"+backStackEntryCount); 
     FragmentManager fragmentManager = getFragmentManager(); 

     if(getFragmentManager().getBackStackEntryCount()-1 >=0){ 
      Fragment currentFragment = fragmentManager 
        .findFragmentByTag(fragmentManager.getBackStackEntryAt(getFragmentManager().getBackStackEntryCount()-1).getName()); 
      Log.i(TAG, "class: "+currentFragment.getClass()); 
      Log.i(TAG, "backstackCount: "+backStackEntryCount); 

      globalCurrentFragment = currentFragment; 

      if(currentFragment.getClass() == Master_Menu.class){ 
       Log.i("currentFragment", "getClass = true"); 

        new AlertDialog.Builder(MainActivity.this) 
        .setTitle("Information") 
        .setMessage("Do you wish to exit from Master Account session?") 
        .setNegativeButton("No", null) 
        .setPositiveButton("Yes", 
          new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int id) { 

            if (globalCurrentFragment != null) { 
             globalCurrentFragment.onResume(); 
            } 
           } 
          }).create().show(); 

      } 
      else{ 
       if (globalCurrentFragment != null) { 
        globalCurrentFragment.onResume(); 
       } 
      } 

      //if offer list 

     }else{ 
      globalCurrentFragment = null; 
      selectItem(0, false); 
     } 

    } 
    super.onBackPressed(); 
} 

Еще раз, я хотел подскажет alertDialog только в «Меню» фрагмента и не оказывают никакого влияния на другой фрагмент. Проконсультируйтесь с этим методом. Если есть какая-либо другая информация, пожалуйста, дайте мне знать.

+0

Пожалуйста, посмотрите на решение я предусмотрел http://stackoverflow.com/a/36475957/2753436 – Praveen

ответ

0

Я решил эту проблему со следующим кодом. Установите keyListener at onResume и удалите ключ-ключ при переключении на другой фрагмент.

public void setKeyListenerOnView(View v){ 

    Log.i(TAG, "setKeyListenerOnView"); 

    v.setFocusableInTouchMode(true); 
    v.requestFocus(); 
    v.setOnKeyListener(new View.OnKeyListener() { 
      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 

       if (event.getAction()!=KeyEvent.ACTION_DOWN) 
        return true; 

        switch (keyCode) { 
        case KeyEvent.KEYCODE_BACK : 
         Log.i("Menu", "onKey Back listener is working!!!"); 
         new AlertDialog.Builder(getActivity()) 
         .setTitle("Information") 
         .setMessage("Do you wish to exit from Master Account session?") 
         .setNegativeButton("No", null) 
         .setPositiveButton("Yes", 
           new DialogInterface.OnClickListener() { 
            @Override 
            public void onClick(DialogInterface dialog, int id) { 

             ((NavigationDrawer)getActivity()).selectItem(0, true); 
            } 
           }).create().show(); 
         break; 
        } 

        return true; 
      } 
     }); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    Log.i(TAG, "onResume"); 
    setKeyListenerOnView(getView()); 
} 


//Remove KeyListener. Implement this when changing to other fragment. 
rootView.setFocusableInTouchMode(true); 
rootView.requestFocus(); 
rootView.setOnKeyListener(null); 
+0

Можете ли вы объяснить это «// Удалить KeyListener. Реализовать это при переходе на другой фрагмент.» ? – VVB