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.