es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo debo implementar onbackpressed() en un fragmento de Kotlin?

Creé una aplicación con 4 fragmentos. Cuando presiono el botón de retroceso en el cuarto fragmento, necesito ir directamente al primer fragmento. He intentado muchas formas, pero ninguna funcionó para mí. Por favor, ayúdeme a encontrar una forma correcta de resolver mi problema.

Actividad Dashboard:

class DashboardActivity: AppCompatActivity() {

    private lateinit var dashboardBinding: ActivityDashboardBinding
    lateinit var sharedPreference: SharedPreference
    private lateinit var navController: NavController
    private lateinit var navHostFragment: NavHostFragment

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        sharedPreference = SharedPreference(this)
        dashboardBinding = DataBindingUtil.setContentView(this, R.layout.activity_dashboard)
        setContentView(dashboardBinding.root)
        navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
        navController = navHostFragment.navController

        val bottomNavigationView = findViewById<bottomnavigationview>(R.id.bottomNavigationView)
        bottomNavigationView.setupWithNavController(navController)
    }

    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        currentFocus?.let {
            val imm: InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as (InputMethodManager)
            imm.hideSoftInputFromWindow(it.windowToken, 0)
        }
        return super.dispatchTouchEvent(ev)
    }
}

Cuarto fragmento:

“`
class ProfileFragment : Fragment() {

<pre><code>lateinit var sharedPreference: SharedPreference
var dob: String = ""
var email: String = ""
var mobile_no: String = ""
var name: String = ""
var mLogoProgressDialog: ProgressDialog? = null

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {

val binding = DataBindingUtil.inflate<fragmentprofilebinding>(
inflater,
R.layout.fragment_profile,
container,
false
)

sharedPreference = context?.let { SharedPreference(it) }!!

var text = sharedPreference.getValueString("token")
Log.d("getToken", "" + text)
if (text != null) {
initializeLogoProgressDialog()
callMyProfile(text, binding)
}

binding.signOut.setOnClickListener {
signOut(text)
}

binding.notificyButton.setOnClickListener {
val dialog = NotifyDialog()
dialog.show(requireActivity().supportFragmentManager, "NotifyDialog")
}
binding.editProf.setOnClickListener {
view?.let { it1 ->
val navController = Navigation.findNavController(it1)
val bundle = Bundle()
bundle.putString("sendMob", mobile_no)
bundle.putString("sendEmail", email)
bundle.putString("sendName", name)
bundle.putString("sendDob", dob)
navController.navigate(R.id.action_profileFragment_to_edtUsernameFragment, bundle)
}
}
binding.changePassword.setOnClickListener {
view?.let { it1 ->
Navigation.findNavController(it1)
.navigate(R.id.action_profileFragment_to_changePasswordFragment)
}
}
binding.signOut.setOnClickListener {
if (sharedPreference.getValueString("token") != null) {
sharedPreference.clearSharedPreference()
}
view?.let { it1 ->
Navigation.findNavController(it1)
.navigate(R.id.action_profileFragment_to_loginActivity)
}
}
binding.deleteAccount.setOnClickListener {
val dialog = DeleteDialog()
dialog.show(requireActivity().supportFragmentManager, "DeleteDialog")
}
return binding.root
}
</code></pre>

}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, necesitas anular la función onBackPressed() en tu DashboardActivity y manejar el botón de volver atrás tú mismo. Aquí están los pasos que puedes seguir:

    1. Agrega el siguiente código a tu DashboardActivity:
    override fun onBackPressed() {
        val currentFragment = navController.currentDestination?.id
        val firstFragment = navController.graph.startDestination
        if (currentFragment != null && currentFragment != firstFragment) {
            navController.navigateUp()
        } else {
            super.onBackPressed()
        }
    }
    
    1. Este código verifica si el fragmento actual no es el inicio del grafo de navegación (es decir, el primer fragmento). Si no lo es, navega al fragmento anterior utilizando el método navController.navigateUp(). De lo contrario, llama al método predeterminado onBackPressed() para salir de la aplicación o realizar cualquier otro comportamiento predeterminado.
    2. Asegúrate de importar las clases y objetos necesarios, como el navController, en tu DashboardActivity.

    3. Prueba el comportamiento lanzando tu aplicación y navegando hasta el cuarto fragmento. Pulsa el botón de volver atrás y comprueba si te lleva directamente al primer fragmento.

    Siguiendo estos pasos, deberías poder manejar la pulsación del botón de volver atrás en tu aplicación y navegar correctamente entre tus fragmentos.

Comments are closed.