2013-08-12 2 views
21

Я работаю над проектом, и мне нужно иметь возможность использовать обратную кнопку в каждом фрагменте для перемещения между предыдущими фрагментами. У меня есть методы, написанные для этого, используя обратную стрелку в Тем не менее, я хочу иметь возможность использовать ту же функциональность на нажатой кнопке «Назад». Я не хочу использовать задний стек. Есть ли способ сделать это?Использование onBackPressed() в Android Fragments

EDIT

Вместо того чтобы использовать заднюю стек, я хочу, чтобы иметь возможность вызвать вернуться к предыдущему методу ниже, когда пользователь нажимает на кнопку назад. Мне нужно использовать метод gobackpressed в фрагментах. Это возможно? Надеюсь, это ясно и красно. Извинения за любую путаницу, вызванную выше.

Вернуться к предыдущему

public void gobackToPreviousFragment(String preFragmentTag, Fragment preFragment){ 

    FragmentManager fm = getSupportFragmentManager(); 

    FragmentTransaction ft = fm.beginTransaction(); 
    ft.setCustomAnimations(R.animator.close_slide_in,R.animator.close_slide_out); 

    ft.show(preFragment); 

    //**BY REMOVING FRAGMENT, WHEN USER TRIES TO REVISIT, FRAGMENT IS BLACK** 

    ft.remove(fm.findFragmentByTag(Misc.currentContentFragmentTag)); 
    ft.addToBackStack(null); 
    ft.commit(); 

    Misc.currentContentFragmentTag = preFragmentTag; 

    createBar(preFragment); 
} 

Go Forward

public void gotoNextFragment(String nextTag, Fragment nextFragment){ 

    FragmentManager fm = getSupportFragmentManager(); 

    FragmentTransaction ft = fm.beginTransaction(); 
    ft.setCustomAnimations(R.animator.enter_slide_in, R.animator.enter_slide_out); 

    boolean newlyCreated = false; 
    if(nextFragment == null){ 
     nextFragment = Fragment.instantiate(this, nextTag); 
     newlyCreated = true; 
    } 

    //hide current fragment 
    ft.hide(fm.findFragmentByTag(Misc.currentContentFragmentTag)); 

    if(newlyCreated){ 
     ft.add(R.id.content_frame, nextFragment, nextTag); 
    } 
    else{ 
     ft.show(nextFragment); 
    } 

    ft.addToBackStack(null); 
    ft.commit(); 
    Misc.currentContentFragmentTag = nextTag; 

    createBar(nextFragment); 
} 

Это, как я перемещаться взад и вперед, и я хотел бы быть в состоянии реализовать метод вернуться на onBackPressed(). Имеет ли это смысл?

+0

Похожие проблемы решены [здесь] (https: // stackoverflow.com/a/46425415/6831069)> Наслаждайтесь –

ответ

19

Почему вы не хотите использовать задний стек? Если есть основная проблема или путаница, возможно, мы сможем ее очистить.

Если вы хотите придерживаться своего требования, просто переопределите метод Activity onBackPressed() и вызовите любой метод, который вы вызываете при нажатии на стрелку назад в вашем ActionBar.

EDIT: Как решить «черный экран» фрагмент обратно проблемы стека:

Вы можете получить вокруг этого вопроса, добавив backstack слушателя к менеджеру фрагмента. То, что слушатель проверяет, является ли фрагмент обратно стек пуст и заканчивает активность соответственно:

Вы можете установить, что слушатель в вашем OnCreate метод Activity в:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    FragmentManager fm = getFragmentManager(); 
    fm.addOnBackStackChangedListener(new OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      if(getFragmentManager().getBackStackEntryCount() == 0) finish(); 
     } 
    }); 
} 
+0

спасибо за ответ, причина, по которой я пытаюсь избежать заднего стека, - это когда я добавил в задний стек и удалил fr agment, когда я нажимаю кнопку, чтобы снова открыть этот фрагмент, я получал черный экран, должен ли я делать какой-то поиск в этом случае? Я новичок в фрагментах, и я пытаюсь взять на себя ранее написанный код. –

+0

@ DJ-DOO Я так и думал, что это проблема. Когда я начал с фрагментов, я столкнулся с одной и той же проблемой. Однако для этой проблемы существует обходной путь. Позвольте мне выкопать код и обновить свой ответ ... – tiguchi

+0

это здорово .. Я застрял в данный момент и не знаю, что делать дальше –

3

В фрагменте, где вы хотели бы обрабатывать ваши кнопки назад вы должны приложить материал к представлению в oncreateview

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.second_fragment, container, false); 
    v.setOnKeyListener(pressed); 
    return v; 
} 



@Override 
public boolean onKey(View v, int keyCode, KeyEvent event) { 
    // TODO Auto-generated method stub 
    if(keyCode == KeyEvent.KEYCODE_BACK){ 
      // back to previous fragment by tag 
      myfragmentclass fragment = (myfragmentclass) getActivity().getSupportFragmentManager().findFragmentByTag(TAG); 
      if(fragment != null){ 
       (getActivity().getSupportFragmentManager().beginTransaction()).replace(R.id.cf_g1_mainframe_fm, fragment).commit(); 
      } 
      return true; 
     } 
     return false; 
    } 
}; 
+5

где вы определили переменную «нажата»? – Daryn

+1

Вы можете определить 'нажата', как это: OnKeyListener нажимается = новый OnKeyListener() { \t \t \t \t @Override \t \t общественного логический OnKey (View v, внутр KEYCODE, KeyEvent событие) { \t \t если (KEYCODE == KeyEvent.KEYCODE_BACK) { \t \t return true; \t} \t return false; \t \t} \t}; – icastell

+2

@ user2886881 Переопределить 'onKey()' в фрагменте? Я так не думаю. –

2

вы можете попробовать переопределить onCreateAnimation, параметр и поймать enter==false. Это будет срабатывать перед каждым обратным нажатием.

@Override 
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {    
     if(!enter){ 
      //leaving fragment 
      Log.d(TAG,"leaving fragment"); 
     } 
     return super.onCreateAnimation(transit, enter, nextAnim); 
    } 
+0

Это решение действительно работает хорошо, но я думаю, что это хак или решение для обработки на обратном – androidXP

-6

Используйте это:

@Override 
public void onBackPressed() { 
    int fragments = getFragmentManager().getBackStackEntryCount(); 
    if (fragments == 1) { 
     finish(); 
    } 
    super.onBackPressed(); 
} 
29

я не нашел хороший ответ об этой проблеме, так что это мое решение.

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

создать интерфейс OnBackPressedListener

public interface OnBackPressedListener { 
    void onBackPressed(); 
} 

, что каждый фрагмент, который хочет быть в курсе backPressреализует этот интерфейс.

В родительской активности, вы можете переопределить onBackPressed()

@Override 
public void onBackPressed() { 
    List<Fragment> fragmentList = getSupportFragmentManager().getFragments(); 
    if (fragmentList != null) { 
     //TODO: Perform your logic to pass back press here 
     for(Fragment fragment : fragmentList){ 
      if(fragment instanceof OnBackPressedListener){ 
       ((OnBackPressedListener)fragment).onBackPressed(); 
      } 
     } 
    } 
} 
+1

Спасибо, друг! работал как шарм! ~ –

+1

Другие решения также работают, но для меня это выглядит лучше. :) –

+0

Что делать, если у моего фрагмента есть некоторые дочерние фрагменты, где я также хотел бы обрабатывать OnBackPressed? – Micer

2

Для фрагмента вы можете просто добавить

getActivity().onBackPressed(); 

в код