¿Cómo implementar onBackPressed() en Fragmentos?

Resuelto Android_programmer_camera asked hace 54 años • 0 respuestas

¿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 onBackPresseden la actividad. Todos FragmentTransactionestán addToBackStackantes del compromiso:

@Override
public void onBackPressed() {

    int count = getSupportFragmentManager().getBackStackEntryCount();

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

}
Hw.Master avatar Jul 22 '2014 08:07 Hw.Master

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
        }
    }
}
Maxime Jallu avatar Sep 26 '2017 11:09 Maxime Jallu