Como transferir uma variável de fragmento para atividade no Android?

Uma história sobre como, no Android, transferir informações de um fragmento (Fragmento) para uma atividade (Atividade). As informações serão úteis para iniciantes (juniores), dominando a programação para Android e dificilmente serão interessantes para intermediários e seniores.

Inicie o Android Studio (ambiente de desenvolvimento integrado) IDE. Crie um novo projeto: Arquivo -> Novo -> Novo Projeto. Selecione "Atividade vazia", ​​clique em "Avançar".



Preencha os campos "Nome", "Nome do pacote", "Salvar local".



O IDE criará automaticamente dois arquivos: “MainActivity.java” no diretório “java / [nome do pacote]”, “activity_main.xml” no diretório “res / layout”.





O arquivo Java determina o que o aplicativo faz , xml - como ele é . Até agora, faz muito pouco, apenas "setContentView (R.layout.activity_main);". Esta linha informa ao aplicativo para usar o layout activity_main.xml na inicialização. E, como o layout contém apenas um widget do tipo "TextView" com o texto "Hello World!", Nosso aplicativo também parece muito modesto.



Na pasta do projeto, crie um fragmento com o nome "Fragmento1".





O IDE criará dois arquivos: “Fragment1” e “fragment_fragment1.xml”.





Abra o arquivo de layout do fragmento e exclua o widget "TextView" de que não precisamos com uma linha de boas-vindas.



Alterne para o modo de design e arraste o botão (Botão) para o layout.



O IDE criará um botão com o identificador "button1".



Agora edite o layout da atividade principal, ou seja, arquivo "activity_main.xml"



Mova o widget de texto para mais alto e adicione o fragmento que criamos ao layout (para fazer isso, arraste o elemento "<>" para o layout, selecione "Fragmento1" e clique em "OK").



No layout da atividade nas configurações de fragmento, defina layout_height = "wrap_content" e edite seu posicionamento ao seu gosto. Também mudaremos o identificador do campo de texto para "textReport" e o fragmento para "fragmentWithButton".



Execute o emulador (Shift + F10) e veja o que aconteceu.



O aplicativo exibe a inscrição "Olá, mundo!" e o botão BOTÃO. A inscrição é deduzida da atividade , o botão pertence a um fragmento . O botão está pressionado, mas até agora não tem efeito. Vamos tentar programar a inscrição para exibir o número de pressionamentos de botão. Para fazer isso, precisaremos enviar uma mensagem sobre o clique do botão do fragmento para a atividade .

Primeiro, ensinaremos o fragmento a contar o número de cliques no botão. Abra o arquivo "Fragment1.java".



Adicione a variável "contador". No método "onCreateView", chamado imediatamente após a criação do fragmento, crie o botão "listener". O IDE exigirá a implementação de View.OnClickListener - concorda (Alt + Enter). Vamos criar (redefinir) o método onClick, que aumentará o valor da variável "counter" a cada clique do botão e exibirá uma mensagem pop-up.



Vamos verificar no emulador (novamente Shift + F10) como ele funciona. Pressionar o botão fará com que a mensagem pop-up “Número de cliques no botão: ...” apareça na parte inferior da tela do aplicativo.



Ótimo, siga em frente. Nosso principal objetivo é transferir informações (nesse caso, o número de cliques no botão) da instância do fragmento para a instância da atividade. Infelizmente, os ciclos de vida de atividades e fragmentos são organizados para que o Android (quase) não permita que a atividade e um fragmento se comuniquem diretamente, por isso precisamos de uma interface intermediária. Vamos chamá-lo de "Carteiro" (carteiro). A interface pode ser criada em um arquivo separado ou em um arquivo com um código de fragmento; vamos escolher a primeira opção. Nossa interface do Postman conterá um único método abstrato (sem um "corpo") de "fragmentMail".



Usaremos a variável "numberOfClicks" como um "envelope" para transferir mensagens do fragmento para a atividade.

Abra o arquivo com o código de atividade "MainActivity.java". Como lembramos, fica assim:



Implementamos a interface Postman e adicionamos o método da interface fragmentMail à atividade, redefinindo-o ( Substituir ).



Agora, assim que a atividade "vir" um novo valor na variável "numberOfClicks", ela exibirá uma mensagem atualizada no campo de texto textReport.

Mas ainda precisamos "colocar a carta no envelope", ou seja, passe para a variável o número de cliques no botão. E fazemos isso no código do fragmento. Abra o arquivo "Fragment1.java".

D̶o̶b̶a̶v̶l̶ya̶e̶m̶ V podpis ̶k̶l̶a̶s̶s̶a̶ ̶i̶m̶p̶l̶e̶m̶e̶n̶t̶a̶ts̶i̶yu̶ ̶i̶n̶t̶e̶r̶f̶e̶y̶s̶a̶ ̶ «carteiro». IDE ̶p̶o̶t̶r̶e̶b̶u̶e̶t̶ ̶p̶e̶r̶e̶o̶p̶r̶e̶d̶e̶l̶i̶t̶̶ Metod ̶i̶n̶t̶e̶r̶f̶e̶y̶s̶a̶ ̶ «̶f̶r̶a̶g̶m̶e̶n̶t̶M̶a̶i̶l̶» ̶, ̶ NÃO delat V nom minha nichego NE budem, ̶ ̶p̶o̶e̶t̶o̶m̶u̶ ̶o̶s̶t̶a̶v̶i̶m̶ ego Telo ̶p̶u̶s̶t̶y̶m̶. [Excluído, consulte "Nota 1 de 20/04/2019"]

Vamos precisar de um link para uma instância de atividade. Obteremos quando um fragmento estiver anexado a uma atividade como esta:


No método “onClick” (o mesmo que é chamado quando o botão do nosso fragmento é clicado), adicionamos uma chamada à interface a partir de uma instância de atividade.



O código final do fragmento após a exclusão (para compactação) dos comentários tem a seguinte aparência:


Agora, nosso fragmento conta o número de cliques no botão , exibe-os em uma mensagem pop-up e, usando a interface do Postman, transfere o valor da variável do contador para a variável numberOfClicks , que serve como um contêiner de envelope para enviar mensagens do fragmento para a atividade. A atividade, recebendo uma nova mensagem, a exibe imediatamente em seu campo de texto do widget com o identificador "textReport". O objetivo é alcançado!


PS: Alterar a linguagem de programação de Java para Kotlin pode reduzir significativamente o fragmento de código:



PPS: Faça o download dos arquivos do projeto aqui: Java , Kotlin .

Nota 1 de 20/04/2019:


A implementação da interface do Postman foi removida do código do fragmento.
Um fragmento trabalha com uma interface através de atividades nas quais essa interface já está implementada.
Obrigado a mikaakim por comentar .
Arquivos atualizados podem ser baixados do github nos links acima.

Source: https://habr.com/ru/post/pt448744/


All Articles