631 Stimmen

Wie implementiert man onBackPressed() in Fragments?

Gibt es eine Möglichkeit, wie wir die onBackPressed() in Android Fragment ähnlich wie in Android Activity implementieren?

Da der Fragment-Lebenszyklus nicht über onBackPressed() . Gibt es eine andere alternative Methode zur Überwindung onBackPressed() in Android 3.0-Fragmenten?

-1voto

eluleci Punkte 3369

Ich hatte das gleiche Problem, und ich habe einen neuen Hörer dafür erstellt und in meinen Fragmenten verwendet.

1 - Ihre Aktivität sollte eine Zuhörerschnittstelle und eine Liste von Zuhörern enthalten

2 - Sie sollten Methoden zum Hinzufügen und Entfernen der Zuhörer implementieren

3 - Sie sollten die onBackPressed-Methode überschreiben, um zu prüfen, ob einer der Zuhörer die Rückwärts-Taste verwendet oder nicht

public class MainActivity ... {

    /**
     * Back press listener list. Used for notifying fragments when onBackPressed called
     */
    private Stack<BackPressListener> backPressListeners = new Stack<BackPressListener>();

    ...

    /**
     * Adding new listener to back press listener stack
     * @param backPressListener
     */
    public void addBackPressListener(BackPressListener backPressListener) {
        backPressListeners.add(backPressListener);
    }

    /**
     * Removing the listener from back press listener stack
     * @param backPressListener
     */
    public void removeBackPressListener(BackPressListener backPressListener) {
        backPressListeners.remove(backPressListener);
    }

    // Overriding onBackPressed to check that is there any listener using this back press
    @Override
    public void onBackPressed() {

        // checks if is there any back press listeners use this press
        for(BackPressListener backPressListener : backPressListeners) {
            if(backPressListener.onBackPressed()) return;
        }

        // if not returns in the loop, calls super onBackPressed
        super.onBackPressed();
    }

}

4 - Ihr Fragment muss die Schnittstelle für Backpress implementieren

5 - Sie müssen das Fragment als Hörer für Backpress hinzufügen

6 - Sie sollten true von onBackPressed zurückgeben, wenn das Fragment dieses Backpress verwendet

7 - WICHTIG - Sie müssen das Fragment aus der Liste onDestroy entfernen

public class MyFragment extends Fragment implements MainActivity.BackPressListener {

    ...

    @Override
    public void onAttach(Activity activity) {
        super.onCreate(savedInstanceState);

        // adding the fragment to listener list
        ((MainActivity) activity).addBackPressListener(this);
    }

    ...

    @Override
    public void onDestroy() {
        super.onDestroy();

        // removing the fragment from the listener list
        ((MainActivity) getActivity()).removeBackPressListener(this);
    }

    ...

    @Override
    public boolean onBackPressed() {

        // you should check that if this fragment is the currently used fragment or not
        // if this fragment is not used at the moment you should return false
        if(!isThisFragmentVisibleAtTheMoment) return false;

        if (isThisFragmentUsingBackPress) {
            // do what you need to do
            return true;
        }
        return false;
    }
}

Anstelle der ArrayList wird ein Stack verwendet, um mit dem letzten Fragment beginnen zu können. Es kann auch ein Problem beim Hinzufügen von Fragmenten zum Stapel geben. Sie müssen also prüfen, ob das Fragment sichtbar ist oder nicht, während Sie back press verwenden. Andernfalls wird eines der Fragmente das Ereignis nutzen und das letzte Fragment wird beim Zurückdrücken nicht geschlossen.

Ich hoffe, damit ist das Problem für alle gelöst.

-1voto

scottyab Punkte 22856

Ich benutze einfach findFragmentById und auf das Fragment übertragen und eine Methode aufrufen, die onBackpressed behandelt. Dieses Beispiel zeigt die Überprüfung, ob dies der erste Schritt in der Reihenfolge Prozess ist, wenn es Pop-up ein Dialog-Fragment, um den Ausgang zu bestätigen, um.

@Override
    public void onBackPressed() {
        //check if first fragment in wizard is loaded, if true get abandon confirmation before going back
        OrderFragment frag =(OrderFragment)getSupportFragmentManager().findFragmentById(R.id.fragContainer);
        if (frag==null || (frag!=null && frag.getOrderStage()<1)){
            AlertDialogFragment.show(getSupportFragmentManager(), R.string.dialog_cancel_order,R.string.dialog_cancel_order_msg, R.string.dialog_cancel_order_pos,R.string.dialog_order_quiz_neg, DIALOG_ID_CANCEL);
        }else {
            super.onBackPressed();
        }
    }

-1voto

   @Override
   public boolean onKeyDown(int keyCode, KeyEvent event)
    {
       if ((keyCode == KeyEvent.KEYCODE_BACK))
  {
           finish();
    }
       return super.onKeyDown(keyCode, event);
    }

Kommentieren Sie einfach eine beliebige Taste nach unten bezogene Methode jetzt addToBackStack wird funktionieren. Danke

-1voto

Elaiya Punkte 9

Einfache Handhabung onBackPressed() in Fragmenten

Schritt 1: Erstellen Sie einen statischen Booleschen Wert in der Aktivität.

public static Fragment_one;

Schritt 2: Auf MainActivity (Aktivität, die das Fragment enthält) in der Methode On Create deklarieren

Fragment_one=true;

Schritt 3: Überschreiben Sie onBackPressed() in MainActivity

@Override
public void onBackPressed() {

    if(Fragment_one) {
     //Back key pressed on fragment one

    }else {
      //Back key pressed on fragment two
    }
}

Schritt 4: Zu Fragment_eins onCreateView Methode deklarieren

MainActivity.Fragment_one=true;

Schritt 5 Zu Fragment_zwei onCreateView Methode deklarieren

MainActivity.Fragment_one=false;

Anmerkung: Diese Methode kann nur auf ZWEI Fragmente angewendet werden.

-1voto

Shyam Kp Punkte 1

Um dies zu implementieren Fragment_1 -> Fragment_2 -> Fragment_3

    Button btn = (Button) rootView.findViewById(R.id.your_button_id);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Fragment_2 nextFrag= new Fragment_2();
            getActivity().getSupportFragmentManager().beginTransaction()
                    .replace(R.id.content_frame, nextFrag,getTag())
                    .addToBackStack(null)
                    .commit();

        }
    });

Fragment_3 -> Fragment_2 -> Fragment_1

Schritt_1: Erstellen eines öffentlich zugänglichen Strings in der Basisaktivität

Schritt_2: Jedes Mal, wenn ein neues Fragment aktiviert wird, ändern Sie den Wert des Strings in der Basisaktivität

Schritt_3: Fügen Sie dann die Methode onBackPressed() hinzu und übergeben Sie den String-Wert an eine andere Methode, in der die Fragmente ersetzt werden können

In der Basisaktivität

public static String currentFragment=null;

@Override
public void onBackPressed() 
{
        displayPreviousFragment(currentFragment);
}

public void displayPreviousFragment(String currentFragment)
{
    //creating fragment object
    Fragment fragment = null;

    //initializing the fragment object which is selected
    switch (currentFragment)
    {
        case "Fragment_2"    :   fragment = new Fargment_1();     break;
        case "Fragment_3"    :   fragment = new Fragment_2();     break;
    }

    //replacing the fragment
    if (fragment != null) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.frame_to_replace_fragment, fragment);
        ft.commit();
    }
}

In Fragment_2 innerhalb der Methode OnCreateView

BaseActivity.currentFragment="Fragment_2";

Im Fragment_3 innerhalb der Methode OnCreateView

BaseActivity.currentFragment="Fragment_3";

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X