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?

5voto

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

    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
                replaceFragmentToBackStack(getActivity(), WelcomeFragment.newInstance(bundle), tags);

                return true;
            }

            return false;
        }
    });
}

5voto

TonnyL Punkte 1015

Nach Angaben der AndroidX Versionshinweise , androidx.activity 1.0.0-alpha01 wird veröffentlicht und führt ein ComponentActivity , eine neue Basisklasse der bestehenden FragmentActivity y AppCompatActivity . Und diese Version bringt uns eine neue Funktion:

Sie können jetzt eine OnBackPressedCallback über addOnBackPressedCallback zu erhalten onBackPressed() Rückrufe, ohne dass die Methode in Ihrer Aktivität überschrieben werden muss.

5voto

krishnakumarcn Punkte 3480

Die Bereitstellung einer benutzerdefinierten Rückwärtsnavigation durch die Behandlung von onBackPressed ist jetzt einfacher mit Callbacks innerhalb des Fragments.

class MyFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val onBackPressedCallback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                if (true == conditionForCustomAction) {
                    myCustomActionHere()
                } else  NavHostFragment.findNavController(this@MyFragment).navigateUp();    
        }
    }
    requireActivity().onBackPressedDispatcher.addCallback(
        this, onBackPressedCallback
    )
    ...
}

Wenn Sie die Standard-Rückholaktion auf der Grundlage einer Bedingung wünschen, können Sie verwenden:

 NavHostFragment.findNavController(this@MyFragment).navigateUp();

4voto

Mete Punkte 2777

In meiner Lösung (Kotlin);

Ich verwende die Funktion onBackAlternative als Parameter für BaseActivity .

BaseActivity

abstract class BaseActivity {

    var onBackPressAlternative: (() -> Unit)? = null

    override fun onBackPressed() {
        if (onBackPressAlternative != null) {
            onBackPressAlternative!!()
        } else {
            super.onBackPressed()
        }
    }
}

Ich habe eine Funktion für set onBackPressAlternative auf BaseFragment .

BaseFragment

abstract class BaseFragment {

     override fun onStart() {
        super.onStart()
        ...
        setOnBackPressed(null) // Add this
     }

      //Method must be declared as open, for overriding in child class
     open fun setOnBackPressed(onBackAlternative: (() -> Unit)?) {
         (activity as BaseActivity<*, *>).onBackPressAlternative = onBackAlternative
     }
}

Dann ist mein onBackPressAlternative bereit, auf Fragmente zu verwenden.

Unter-Fragmente

override fun setOnBackPressed(onBackAlternative: (() -> Unit)?) {
    (activity as BaseActivity<*, *>).onBackPressAlternative = {
        // TODO Your own custom onback function 
    }
}

4voto

The Finest Artist Punkte 3042

Wie wäre es mit der Verwendung von onDestroyView()?

@Override
public void onDestroyView() {
    super.onDestroyView();
}

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