Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Modo landscape tá quebrando o app quando toco na notícia

Quando eu clico na notícia o app quebra. Mas apenas no modo landscape

meu código

package br.com.souza.xavier.fernando.technews.ui.activity

import android.content.Intent
import android.content.res.Configuration
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentOnAttachListener
import br.com.souza.xavier.fernando.technews.R
import br.com.souza.xavier.fernando.technews.model.Noticia
import br.com.souza.xavier.fernando.technews.ui.activity.extensions.transacaoFragment
import br.com.souza.xavier.fernando.technews.ui.fragment.ListaNoticiasFragment
import br.com.souza.xavier.fernando.technews.ui.fragment.VisualizaNoticiasFragment


private const val TAG_FRAGMENT_VISUALIZA_NOTICIA = "visualizaNoticia"

class NoticiasActivity : AppCompatActivity() {

    init {
        val fm = supportFragmentManager
        val listener = FragmentOnAttachListener { _, fragment ->
            when (fragment) {
                is ListaNoticiasFragment -> {
                    configuraListaNoticias(fragment)
                }

                is VisualizaNoticiasFragment -> {
                    configuraVisualizaNoticia(fragment)
                }
            }
        }
        fm.addFragmentOnAttachListener(listener)
    }

    private fun configuraVisualizaNoticia(fragment: VisualizaNoticiasFragment) {
        fragment.quandoFinalizaTela = this::finish
        fragment.quandoSelecionaMenuEdicao = this::abreFormularioEdicao
    }

    private fun configuraListaNoticias(fragment: ListaNoticiasFragment) {
        fragment.quandoNoticiaSeleciona = this::abreVisualizadorNoticia
        fragment.quandoFabSalvaNoticiaClicado = this::abreFormularioModoCriacao
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_noticias)
        if (savedInstanceState == null) {
            abreListaNoticias()
        } else {
            supportFragmentManager
                .findFragmentByTag(TAG_FRAGMENT_VISUALIZA_NOTICIA)?.let { fragment ->

                    val argumentos = fragment.arguments
                    val novoFragment = VisualizaNoticiasFragment()
                    novoFragment.arguments = argumentos

                    transacaoFragment {
                        remove(fragment)
                    }
                    supportFragmentManager.popBackStack()

                    transacaoFragment {
                        val container =
                            if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                                R.id.activity_noticias_container_secundario
                            } else {
                                addToBackStack(null)
                                R.id.activity_noticias_container_primario
                            }
                        replace(container, novoFragment, TAG_FRAGMENT_VISUALIZA_NOTICIA)
                    }
                }
        }
    }

    private fun abreListaNoticias() {
        transacaoFragment {
            replace(R.id.activity_noticias_container_primario, ListaNoticiasFragment())
        }
    }


    private fun abreFormularioModoCriacao() {
        val intent = Intent(this, FormularioNoticiaActivity::class.java)
        startActivity(intent)
    }

    private fun abreVisualizadorNoticia(noticia: Noticia) {
        val fragment = VisualizaNoticiasFragment()
        val dados = Bundle()
        dados.putLong(NOTICIA_ID_CHAVE, noticia.id)
        fragment.arguments = dados
        transacaoFragment {
            val container = if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                R.id.activity_noticias_container_secundario
            } else {
                addToBackStack(null)
                R.id.activity_noticias_container_primario
            }
            replace(container, fragment, TAG_FRAGMENT_VISUALIZA_NOTICIA)
        }
    }


    private fun abreFormularioEdicao(noticia: Noticia) {
        val intent = Intent(this, FormularioNoticiaActivity::class.java)
        intent.putExtra(NOTICIA_ID_CHAVE, noticia.id)
        startActivity(intent)
    }

}

Existem alguma diferenças em razão de funções depreciadas como por exemplo o bloco "init" que substitui a sobrescrita da função onAttachFragment Fora isso é tudo igual ao do professor. Contudo quando entrei nessa aula o click sobre a alteração da notícia parou de funcionar

Segue Logcat no comentário abaixo ( não coube aqui )

uma leitura por cima parece que o notíciaId não está funcionando na função putLong ... ou seja... o Id se perde

3 respostas
2024-01-18 10:44:38.843 27858-27858 AndroidRuntime          br....ouza.xavier.fernando.technews  D  Shutting down VM
2024-01-18 10:44:38.845 27858-27858 AndroidRuntime          br....ouza.xavier.fernando.technews  E  FATAL EXCEPTION: main
                                                                                                    Process: br.com.souza.xavier.fernando.technews, PID: 27858
                                                                                                    java.lang.IllegalArgumentException: No view found for id 0x7f080046 (br.com.souza.xavier.fernando.technews:id/activity_noticias_container_secundario) for fragment VisualizaNoticiasFragment{89e27c8} (c514ece7-f8d5-4991-a17e-6bf6a2b06329 id=0x7f080046 tag=visualizaNoticia)
                                                                                                        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:547)
                                                                                                        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:272)
                                                                                                        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1943)
                                                                                                        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1839)
                                                                                                        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1782)
                                                                                                        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:565)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:942)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:226)
                                                                                                        at android.os.Looper.loop(Looper.java:313)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8757)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
---------------------------- PROCESS ENDED (27858) for package br.com.souza.xavier.fernando.technews --------------------
solução!

Olá, Fernando! Tudo bem?

Pelo que você descreveu e pelo código compartilhado, parece que o problema está relacionado à perda do ID da notícia durante a rotação da tela. Isso pode acontecer se o estado do fragment não estiver sendo salvo corretamente.

No seu método abreVisualizadorNoticia(noticia: Noticia), você está criando um novo Bundle, colocando o ID da notícia nele e, em seguida, definindo este Bundle como argumentos do fragmento. Isso está correto e deve garantir que o ID da notícia seja mantido durante a rotação da tela.

No entanto, no seu método onCreate(savedInstanceState: Bundle?), você está criando um novo VisualizaNoticiasFragment e definindo seus argumentos como os argumentos do fragmento encontrado. Se o fragmento encontrado não tiver argumentos (ou seja, se fragment.arguments for nulo), então o novo fragmento também não terá argumentos e o ID da notícia será perdido.

Uma possível solução para este problema seria garantir que o Bundle com o ID da notícia seja sempre passado para o novo fragmento, mesmo que o fragmento encontrado não tenha argumentos. Aqui está um exemplo de como você poderia fazer isso:

val argumentos = fragment.arguments ?: Bundle().apply {
    putLong(NOTICIA_ID_CHAVE, noticia.id)
}
val novoFragment = VisualizaNoticiasFragment()
novoFragment.arguments = argumentos

Neste exemplo, se fragment.arguments for nulo, um novo Bundle é criado e o ID da notícia é colocado nele. Em seguida, este Bundle é definido como os argumentos do novo fragmento.

Espero que isso resolva o problema! Lembre-se de fazer testes adequados após fazer essa alteração para garantir que tudo está funcionando como esperado.

Espero ter ajudado e bons estudos!

Obrigadooooooo

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software