¿Cómo implementar onBackPressed() en Fragmentos?
¿Existe alguna forma en la que podamos implementar onBackPressed()
en Android Fragment similar a la forma en que implementamos en Android Activity?
Como el ciclo de vida del Fragmento no lo tiene onBackPressed()
. ¿ Existe algún otro método alternativo para anular onBackPressed()
los fragmentos de Android 3.0?
Aceptado
Anular onBackPressed
en la actividad. Todos FragmentTransaction
están addToBackStack
antes del compromiso:
@Override
public void onBackPressed() {
int count = getSupportFragmentManager().getBackStackEntryCount();
if (count == 0) {
super.onBackPressed();
//additional code
} else {
getSupportFragmentManager().popBackStack();
}
}
En mi opinión la mejor solución es:
SOLUCIÓN JAVA
Crear una interfaz sencilla:
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();
}
Y en tu actividad
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();
}
} ...
}
Finalmente en tu Fragmento:
public class MyFragment extends Fragment implements IOnBackPressed{
@Override
public boolean onBackPressed() {
if (myCondition) {
//action not popBackStack
return true;
} else {
return false;
}
}
}
SOLUCIÓN KOTLIN
1 - Crear interfaz
interface IOnBackPressed {
fun onBackPressed(): Boolean
}
2 - Prepara tu actividad
class MyActivity : AppCompatActivity() {
override fun onBackPressed() {
val fragment =
this.supportFragmentManager.findFragmentById(R.id.main_container)
(fragment as? IOnBackPressed)?.onBackPressed()?.not()?.let {
super.onBackPressed()
}
}
}
3 - Implemente en su Fragmento de destino
class MyFragment : Fragment(), IOnBackPressed {
override fun onBackPressed(): Boolean {
return if (myCondition) {
//action not popBackStack
true
} else {
false
}
}
}