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.

Kotlin: Es necesario hacer doble clic en los botones dentro de un fragmento antes de iniciar la actividad. ¿Cómo puedo iniciar la actividad con un solo clic?

Nuevo aquí! Estoy teniendo dificultades para aprender el ciclo de vida de los fragmentos y estoy atrapado en este problema. Si ejecuto esto en el emulador, el fragmento se muestra en la actividad, pero el botón dentro del fragmento debe hacer clic dos veces para ejecutar la actividad de destino.

FragmentSetting.kt:

class FragmentSetting : Fragment(), View.OnClickListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view: View = inflater!!.inflate(R.layout.fragment_main_setting, container, false)
        val btnLogout: Button = view.findViewById(R.id.btn_logout)
        val btnArticle: Button = view.findViewById(R.id.btn_art)
        btnLogout.setOnClickListener(this)
        btnArticle.setOnClickListener(this)
        return view
    }

    companion object {
        fun newInstance(): FragmentSetting {
            return FragmentSetting()
        }
    }

    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.btn_logout -> {
                btn_logout.setOnClickListener {
                    Toast.makeText(getContext(), "Cerrado sesión.", Toast.LENGTH_SHORT).show()
                    FirebaseAuth.getInstance().signOut()
                    val intent = Intent(activity, SignInActivity::class.java)
                    startActivity(intent)
                }
            }

            R.id.btn_art -> {
                btn_art.setOnClickListener {
                    Toast.makeText(getContext(), "Hola Mundo", Toast.LENGTH_SHORT).show()
                    val intent = Intent(activity, ArticleActivity::class.java)
                    startActivity(intent)
                }
            }
        }
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual se necesita hacer clic dos veces en el botón dentro del fragmento para ejecutar la actividad de destino es porque el método setOnClickListener se llama dentro del método onClick. Esto significa que el primer clic solo establece el escuchador para el botón, y el segundo clic realmente ejecuta el código dentro del escuchador.

    Para solucionar esto, mueve el método setOnClickListener fuera del bloque when y colócalo dentro del método onViewCreated en su lugar. Aquí tienes una versión actualizada del código:

    class FragmentSetting : Fragment(), View.OnClickListener {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
        }
    
        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            val view: View = inflater.inflate(R.layout.fragment_main_setting, container, false)
            val btnLogout: Button = view.findViewById(R.id.btn_logout)
            val btnArticle: Button = view.findViewById(R.id.btn_art)
            btnLogout.setOnClickListener(this)
            btnArticle.setOnClickListener(this)
            return view
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            val btnLogout: Button = view.findViewById(R.id.btn_logout)
            val btnArticle: Button = view.findViewById(R.id.btn_art)
    
            btnLogout.setOnClickListener {
                Toast.makeText(getContext(), "Cerrado sesión.", Toast.LENGTH_SHORT).show()
                FirebaseAuth.getInstance().signOut()
                val intent = Intent(activity, SignInActivity::class.java)
                startActivity(intent)
            }
    
            btnArticle.setOnClickListener {
                Toast.makeText(getContext(), "Hola Mundo", Toast.LENGTH_SHORT).show()
                val intent = Intent(activity, ArticleActivity::class.java)
                startActivity(intent)
            }
        }
    
        companion object {
            fun newInstance(): FragmentSetting {
                return FragmentSetting()
            }
        }
    
        override fun onClick(v: View?) {
            // no hacer nada
        }
    }
    

    Con estos cambios, hacer clic en el botón una vez debería ejecutar la actividad de destino.

Comments are closed.