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?

351voto

Hw.Master Punkte 4322

Ich löste auf diese Weise überschreiben onBackPressed in der Aktivität. Alle FragmentTransaction sont addToBackStack vor der Übergabe:

@Override
public void onBackPressed() {

    int count = getSupportFragmentManager().getBackStackEntryCount();

    if (count == 0) {
        super.onBackPressed();
        //additional code
    } else {
        getSupportFragmentManager().popBackStack();
    }

}

222voto

Maxime Jallu Punkte 2284

Meiner Meinung nach ist das die beste Lösung:

JAVA-LÖSUNG

Einfache Schnittstelle erstellen :

public interface IOnBackPressed {
    /**
     * If you return true the back press will not be taken into account, otherwise the activity will act naturally
     * @return true if your processing has priority if not false
     */
    boolean onBackPressed();
}

Und in Ihrer Aktivität

public class MyActivity extends Activity {
    @Override public void onBackPressed() {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_container);
       if (!(fragment instanceof IOnBackPressed) || !((IOnBackPressed) fragment).onBackPressed()) {
          super.onBackPressed();
       }
    } ...
}

Schließlich in Ihrem Fragment:

public class MyFragment extends Fragment implements IOnBackPressed{
   @Override
   public boolean onBackPressed() {
       if (myCondition) {
            //action not popBackStack
            return true; 
        } else {
            return false;
        }
    }
}

KOTLIN-LÖSUNG

1 - Schnittstelle erstellen

interface IOnBackPressed {
    fun onBackPressed(): Boolean
}

2 - Bereiten Sie Ihre Aktivität vor

class MyActivity : AppCompatActivity() {
    override fun onBackPressed() {
        val fragment =
            this.supportFragmentManager.findFragmentById(R.id.main_container)
        (fragment as? IOnBackPressed)?.onBackPressed()?.not()?.let {
            super.onBackPressed()
        }
    }
}

3 - Implementierung in Ihr Zielfragment

class MyFragment : Fragment(), IOnBackPressed {
    override fun onBackPressed(): Boolean {
        return if (myCondition) {
            //action not popBackStack
            true
        } else {
            false
        }
    }
}

207voto

aaronmarino Punkte 3096

Wenn Sie Folgendes verwenden androidx.appcompat:appcompat:1.1.0 oder höher, dann können Sie eine OnBackPressedCallback zu Ihrem Fragment wie folgt

requireActivity()
    .onBackPressedDispatcher
    .addCallback(this, object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            Log.d(TAG, "Fragment back pressed invoked")
            // Do custom work here    

            // if you want onBackPressed() to be called as normal afterwards
            if (isEnabled) {
                isEnabled = false
                requireActivity().onBackPressed()
            }
        }
    }
)

Siehe https://developer.Android.com/guide/navigation/navigation-custom-back

104voto

deadfish Punkte 11706

Nach @HaMMeRed Antwort hier ist Pseudocode, wie sollte es funktionieren. Nehmen wir an, Ihre Hauptaktivität heißt BaseActivity die untergeordnete Fragmente hat (wie im Beispiel der SlidingMenu-Bibliothek). Hier sind die Schritte:

Zuerst müssen wir eine Schnittstelle und eine Klasse erstellen, die ihre Schnittstelle implementiert, um eine generische Methode zu haben

  1. Klassenschnittstelle erstellen OnBackPressedListener

    public interface OnBackPressedListener {
        public void doBack();
    }
  2. Erstellen Sie eine Klasse, die die Fähigkeiten von OnBackPressedListener

    public class BaseBackPressedListener implements OnBackPressedListener {
        private final FragmentActivity activity;
    
        public BaseBackPressedListener(FragmentActivity activity) {
            this.activity = activity;
        }
    
        @Override
        public void doBack() {
            activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
    }
  3. Ab jetzt werden wir an unserem Code arbeiten BaseActivity und seine Fragmente

  4. Erstellen Sie einen privaten Listener am Anfang Ihrer Klasse BaseActivity

    protected OnBackPressedListener onBackPressedListener;
  5. Methode zum Einstellen des Hörers in BaseActivity

    public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
        this.onBackPressedListener = onBackPressedListener;
    }
  6. im Überschwang onBackPressed so etwas zu implementieren

    @Override
    public void onBackPressed() {
        if (onBackPressedListener != null)
            onBackPressedListener.doBack();
        else
            super.onBackPressed();
  7. in Ihrem Fragment in onCreateView Sie sollten unseren Hörer hinzufügen

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        activity = getActivity();
    
        ((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity));
    
        View view = ... ;
    //stuff with view
    
        return view;
    }

Voila, jetzt, wenn Sie zurück in Fragment klicken, sollten Sie Ihre benutzerdefinierte auf zurück Methode zu fangen.

101voto

Rodrigo Rodrigues Punkte 1229

Das hat bei mir funktioniert: https://stackoverflow.com/a/27145007/3934111

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

    if(getView() == null){
        return;
    }

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

            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
                // handle back button's click listener
                return true;
            }
            return false;
        }
    });
}

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