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

Mahmoud Ayman Punkte 1135

Keine Erwähnung wie kann ich anrufen activity?.onBackPressed innerhalb dieser Logik.

Deshalb habe ich eine Erweiterung erstellt, die für Sie nützlich sein könnte:

fun Fragment.onBackClick(callback: (onBackPressedCallback: OnBackPressedCallback) -> Unit) {
// This callback will only be called when MyFragment is at least Started.

    activity?.onBackPressedDispatcher?.addCallback(viewLifecycleOwner) {
        callback.invoke(this)
    }
}

Jetzt kommt der spannende Teil onBackPressed wenn Ihre Logik fertig ist:

Musterverwendung in einem Fragment:

onBackClick { 
        if (shouldBackFromFrag){
            //do your logic when pressed back
        }else{
            it.isEnabled = false //the key to disable the dispatcher
            activity?.onBackPressed()
        }
    }

1voto

Braian Coronel Punkte 19992

Wenn Sie die Implementierung im Fragment haben müssen, sollten Sie eine Schnittstelle verwenden .

Andererseits, wenn Sie die Implementierung in der Aktivität benötigen, wie z.B. die Durchführung einer einfachen finish() der Aktivität Folgendes tun:

YourActivity.kt

override fun onBackPressed() {
    Log.d(this.javaClass.simpleName, "onBackPressed() called")

    if (supportFragmentManager.fragments.any { it is YourFragment }) {
        finish()
        return
    }
}

1voto

zeeshan khan Punkte 198

Ich weiß, es ist zu spät, aber ich hatte letzte Woche das gleiche Problem. Keine der Antworten hat mir geholfen. Ich habe dann mit dem Code herumgespielt und das hat funktioniert, da ich die Fragmente bereits hinzugefügt hatte.

Setzen Sie in Ihrer Aktivität eine OnPageChangeListener für die ViewPager damit Sie wissen, wann sich der Benutzer in der zweiten Aktivität befindet. Wenn er sich in der zweiten Aktivität befindet, machen Sie einen booleschen true wie folgt:

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setCurrentItem(0);
    mViewPager.addOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            // TODO Auto-generated method stub
                mSectionsPagerAdapter.instantiateItem(mViewPager, position);
                if(position == 1)
                    inAnalytics = true;
                else if(position == 0)
                    inAnalytics = false;
        }

        @Override
        public void onPageScrolled(int position, float arg1, int arg2) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub

        }
    });

Prüfen Sie nun, ob der Boolesche Wert beim Drücken der Zurück-Taste angezeigt wird, und setzen Sie das aktuelle Element auf Ihr erstes Fragment:

@Override
public void onBackPressed() {
    if(inAnalytics)
        mViewPager.setCurrentItem(0, true);
    else 
        super.onBackPressed();
}

1voto

aoemerson Punkte 147

Ich habe einen anderen Ansatz wie folgt verwendet:

  • Eine Otto Veranstaltungsbus zur Kommunikation zwischen der Aktivität und ihren Fragmenten
  • Ein Stapel in der Aktivität, der benutzerdefinierte zurück Aktionen, verpackt in einer Runnable dass das aufrufende Fragment definiert
  • Wenn onBackPressed in der kontrollierenden Aktivität aufgerufen wird, wird die letzte benutzerdefinierte zurück Aktion und führt seine Runnable . Wenn sich auf dem Stapel nichts befindet, wird der Standard super.onBackPressed() heißt

Der vollständige Ansatz mit Beispielcode ist enthalten aquí als Antwort auf diese andere SO-Frage .

1voto

Es ist ganz einfach: Sie haben eine Aktivität A und machen 3 Fragmente wie B, C und D. Wenn Sie nun in Fragment B oder C sind und onBackPressed Sie wollen sich jedes Mal auf Fragment D bewegen, dann müssen Sie einfach die onBackPressed() Methode in der Hauptaktivität A und auch wenn Sie zu einem beliebigen Fragment springen, übergeben Sie eine TAG oder Name des Fragments, an dem Sie das Fragment in der Haupttätigkeit A erkannt haben.

Ich gebe ein Beispiel, an dem Sie leicht verstehen können, dass....

if (savedInstanceState == null) {

   getSupportFragmentManager().beginTransaction().add(R.id.container, new C_fragment(),"xyz").commit();

}

oder wenn Sie sich von Fragment B nach Fragment C bewegen... und beim Zurückdrücken auf Fragment D kommen wollen... wie unten

btn.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {

        getActivity().getSupportFragmentManager().beginTransaction().add(R.id.container, new C_frament(), "xyz").commit();
        ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle("Fragment C");
    }
});

Jetzt müssen Sie nur die onBackPressed()-Methode in der Hauptaktivität überschreiben....like below..

@Override
public void onBackPressed() {
    FragmentManager fragmentManager =getSupportFragmentManager();
    if (((C_fragment) getSupportFragmentManager().findFragmentByTag("xyz")) != null && ((C_fragment) getSupportFragmentManager().findFragmentByTag("xyz")).isVisible()) {
        Fragment fragment = new D_Fragment();
        fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
        getSupportActionBar().setTitle("D fragment ");
    } else {
        super.onBackPressed();
    }
}

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