2013-08-12 15 views
21

Pracuję nad projektem i muszę mieć możliwość użycia przycisku wstecz w każdym fragmencie, aby nawigować pomiędzy poprzednimi fragmentami. Mam metody napisane w tym celu przy użyciu strzałki wstecznej w pasek akcji, chcę jednak móc korzystać z tej samej funkcjonalności na naciśniętym przycisku wstecz. Nie chcę używać tylnego stosu. Czy jest jakiś sposób na zrobienie tego?Używanie onBackPressed() w fragmentach Androida

EDIT

Zamiast używać tylną stos Chcę być w stanie wywołać wrócić do poprzedniej metody poniżej, gdy użytkownik kliknie przycisk Wstecz. Potrzebuję użyć metody Gobackpressed w fragmentach. czy to możliwe? Mam nadzieję, że jest to jasne i zwięzłe. Przepraszamy za wszelkie zamieszanie spowodowane powyższym.

powrót do poprzedniej

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); 
} 

iść naprzód

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); 
} 

Są jak poruszać się tam iz powrotem, i chciałbym, aby móc realizować wrócić metodę na onBackPressed(). Czy to ma sens?

+0

Podobny problem rozwiązany [tutaj] (https: // stackoverflow.com/a/46425415/6831069)> Ciesz się –

Odpowiedz

19

Dlaczego nie chcesz użyć tylnego stosu? Jeśli istnieje podstawowy problem lub zamieszanie, być może możemy to dla ciebie wyjaśnić.

Jeśli chcesz spełnić swoje wymagania, po prostu przesłonię metodę onBackPressed() w ramach działania i wywołaj dowolną metodę, do której chcesz zadzwonić, gdy kliknie się strzałka wstecz w pasku akcji.

EDIT: Jak rozwiązać „czarny ekran” fragment z powrotem problemu stosu:

Możesz obejść ten problem poprzez dodanie słuchacza backstack do kierownika fragmentów. Że kontrole słuchaczy czy fragment z powrotem stos jest pusty, a kończy Aktywny odpowiednio:

Można ustawić, że słuchacz w swoim onCreate Przebieg ćwiczenia to:

@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

dzięki za odpowiedź, powód, dla którego próbuję uniknąć tylnego stosu, kiedy dodałem do tylnego stosu i usunąłem fr po kliknięciu przycisku, aby ponownie otworzyć ten fragment, otrzymywałem czarny ekran, czy powinienem w tym przypadku wykonać jakieś odzyskiwanie? Jestem nowy w kawałkach i próbuję przejąć wcześniej napisany kod. –

+0

@ DJ-DOO Już pomyślałem, że to jest problem. Kiedy zaczynałem od fragmentów, natrafiłem na dokładnie ten sam problem. Istnieje jednak obejście tego problemu. Pozwól, że wykopię jakiś kod i zaktualizuję odpowiedź ... – tiguchi

+0

To świetnie .. Utknąłem w tej chwili i nie jestem pewien, co dalej. –

3

we fragmencie, w którym chcesz obsługiwać przycisk Wstecz należy dołączyć do widzenia rzeczy w 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

gdzie zdefiniowałeś "wciśniętą" zmienną? – Daryn

+1

Można zdefiniowanie 'wciśnięty' tak: OnKeyListener wciśnięty = new OnKeyListener() { \t \t \t \t @Override \t \t public boolean onkey (Zobacz v, int keyCode, wydarzenie keyEvent) { \t \t if (keyCode == KeyEvent.KEYCODE_BACK) { \t \t return true; \t} \t return false; \t \t} \t}; – icastell

+2

@ user2886881 Zastąp 'onKey()' w Fragmentie? Nie sądzę. –

2

można spróbować zastąpić onCreateAnimation, parametr i złapać enter==false. To będzie strzelać przed każdym powrotem.

@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

To rozwiązanie naprawdę działa dobrze, ale myślę, czy to hack lub rozwiązanie do obsługi na backpressed – androidXP

-6

Użyj tego:

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

Nie mogę znaleźć żadnej dobrej odpowiedzi na temat tego problemu, więc to jest moje rozwiązanie.

Aby odzyskać dostęp do każdego fragmentu, wykonaj następujące czynności.

stworzyć interfejs OnBackPressedListener

public interface OnBackPressedListener { 
    void onBackPressed(); 
} 

że każdy fragment, który chce być informowany o backPressimplementuje ten interfejs.

W działalności macierzystego można przesłonić 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

Dzięki kumpel !!! pracował jak urok! ~ –

+1

Inne rozwiązania również działają, ale dla mnie wygląda to lepiej. :) –

+0

Co zrobić, jeśli mój fragment zawiera fragmenty potomne, w których chciałbym również obsłużyć program OnBackPressed? – Micer

2

Przez Fragment można po prostu dodać

getActivity().onBackPressed(); 

do kodu

Powiązane problemy