Voltar ao Sumário
Cria Enquete - Parte 2
Edite pesquisas de opinião.
Este projeto adiciona funcionalidade ao anterior: Cria Enquete. Se você deve começar por lá antes de prosseguir.Dessa vez, você vai adicionar funcionalidade ao seu App para editar formulários de enquetes.
Preparação - Novo Projeto, Telas, Novos Componentes
Seu aplicativo já tem bastante funcionalidade, e esta modificação vai partir do que já está construído. Você pode continuar trabalhando no mesmo projeto do App Inventor, ou pode copiar o código para um novo projeto. Para isso, utilize a opção de menu Projetos/Salvar Projeto Como... no diálogo que surge, escolha o novo nome (por exemplo, CriaEnquete2). No painel de Propriedades para Screen1, altere o nome da versão para 1.1. Esse é um método muito utilizado para indicar a evolução de sistemas: Cada vez que se adiciona mais funcionalidade sem mudar muito o sistema, o número após o ponto é incrementado. Se a funcionalidade do aplicativo mudar muito com relação à versão anterior, o número antes do ponto é incrementado.Na versão anterior, o nome do arquivo de enquete era escolhido com um diálogo simples ativado através do componente Notificador1. Para editar uma enquete, faz mais sentido deixar o usuário escolher um arquivo já existente. Uma forma de fazer isso é "terceirizar" a função, e deixar um outro App, um Gerenciador de Arquivos, ajudar o usuário a escolher o arquivo. Existe um componente na pasta Conectividade que trata da ativação de outros aplicativos, o IniciadorDeAtividades. Você vai precisar de um desses, e um novo botão na tela principal.
1 - No Designer para Screen1, adicione um Botão e um IniciadorDeAtividades (veja na pasta Conectividade). Mude o nome do Botão para btEditar, e o texto do mesmo para Editar. No componente IniciadorDeAtividades1, preencha a propriedade Ação com o seguinte texto: android.intent.action.GET_CONTENT. Preencha também a propriedade TipoDeDados com o texto: text/*.
O que você está dizendo ao IniciadorDeAtividades é que, ao ser ativado, ele deve procurar um App para abrir um arquivo para leitura, e que o tipo de arquivo procurado é qualquer arquivo contendo texto (arquivos .csv incluídos).
Esse passo encerra as alterações na tela Screen1.
Sua tela deve estar Assim:
Você vai precisar mudar uma parte do código. Passe ao Editor de Blocos.
Blocos para Screen1
O tratamento de btCriar e de Notificador1 para tratar a resposta ao diálogo CriarEnquete já está pronto. Por enquanto, deixe como está. Você precisa tratar o novo botão.2 - Crie o conjunto de blocos abaixo (você já deve ser capaz de identificar os componentes ou grupos onde se encontra cada bloco):
Este conjunto de blocos funciona assim: O bloco mais externo, você já conhece. Ele trata o evento que ocorre quando o usuário toca no botão btEditar. O bloco se.. então... senão testa se IniciardorDeAtividades1 sabe resolver a atividade de abrir um Gerenciador de Arquivos para escolher um arquivo de texto. Se não sabe, Notificador1 é usado para mostrar uma mensagem temporária, de que não foi encontrado um Gerenciador de Arquivos. Por outro lado, se está tudo certo, IniciadorDeAtividades1 é usado para iniciar a atividade do Gerenciador de Arquivos. Com o programa em funcionamento, nesse instante, surge a tela do Gerenciador de Arquivos, e você pode navegar nas pastas de arquivos do dispositivo e escolher um arquivo para editar.
Quando um arquivo é finalmente escolhido, um evento no seu aplicativo é ativado, indicando que a atividade iniciada foi concluída. Você precisa tratar esse evento.
3 - Crie o conjunto de blocos abaixo:
Por enquanto, tudo o que acontece depois de o arquivo ser escolhido, é que uma notificação mostra o caminho completo para o arquivo. Durante os testes realizados, utilizando exemplos de uso disponíveis em tutoriais do App Inventor, as tentativas de abrir um arquivo utilizando esta URI retornada resultaram em erros nos dispositivos testados. Verificando os padrões, descobrimos que na URI, o texto após a sequencia /emulated/0 formava um caminho válido como nome de arquivo. Com isso, criamos um procedimento para transformar a URI em um nome de arquivo. Pode ser que esse procedimento não funcione para algum dispositivo. Nesse caso, é necessário estudar os padrões retornados em URIDoResultado e alterar o procedimento.
Veja a descrição em texto do que o procedimento deve fazer:
1. Repartir do texto da URI em duas partes, divididas pela sequencia "/emulated/0".
2. Retornar a segunda parte como resultado do procedimento.
3. Se a sequencia indicada em 1 não for encontrada,
3.1 Retornar texto vazio, que indica um erro na URI recebida.
Você precisa implementar esse procedimento. Comece com o corpo do procedimento e as variáveis das quais vai precisar. Você precisa de uma lista para guardar as partes da repartição do texto, e uma variável para guardar o nome do arquivo que vai ser retornado.
4 - Crie o conjunto de blocos abaixo:
5 - Monte o conjunto de blocos abaixo e encaixe na inicialização das variáveis criada no passo 4. Nota: Os blocos foram destacados da inicialização, para melhor clareza, mas a melhor forma de montá-los é encaixando cada um diretamente no conjunto, de forma que seja possível escolher as variáveis nos blocos ajustar e obter, que, na imagem abaixo, estão marcados com círculos vermelhos por terem sido destacados do corpo do procedimento.
O passo 5 envolve algum trabalho, mas com paciência você consegue. Preste bastante atenção no nome de cada variável.
É importante entender como funciona o conjunto que você criou: O bloco mais externo executa alguns comandos e retorna um resultado, que vai ser o resultado do procedimento. O bloco se... então testa se existe a sequencia "/emulated/0" no texto da URI. Se a sequencia existe, o comando repartir no primeiro gera a lista com as partes de txt_uri antes e depois da sequencia. O nome de arquivo que você deseja está na segunda parte. O comando seguinte armazena essa parte na variável nome_arq.
Seu procedimento está pronto, e agora pode ser utilizado para transformar uma URI em um nome de arquivo válido.
6 - Monte os blocos abaixo para tranformar a URI retornada pelo IniciadorDeAtividades em um nome de arquivo válido:
Agora, você tem o que precisa para completar o tratamento de quando IniciadorDeAtividades1.DepoisDaAtividade: Você vai passar o nome do arquivo escolhido para TelaPerguntas. Só que o método simples que escolhemos para passar um parâmetro para essa segunda tela não vai permitir distinguir uma operação de criação de uma operação de edição de arquivo. Você pode resolver isso (de uma maneira não tão elegante) adicionando um prefixo ao nome do arquivo.
7 - Adicione ao evento quando IniciadorDeAtividades1.DepoisDaAtividade o conjunto de blocos marcado pelo contorno amarelo (note que a parte mais interna é o conjunto criado no passo 6):
Esse conjunto inicia TelaPerguntas com o nome do arquivo escolhido, precedido pelo prefixo "editar:".
Esse é todo o código que você vai escrever para a tela Screen1.
Blocos para TelaPerguntas
Nesta alteração, nada muda na interface com o usuário na segunda tela do App - TelaPerguntas. O que vai mudar é a parte do código que lida com o nome do arquivo de enquete.Use os botões na segunda barra de opções do App Inventor para passar para TelaPerguntas e para o Editor de Blocos.
As alterações necessárias começam com o tratamento de quando TelaPerguntas.Inicializar. Quando a ação a executar for de edição do arquivo de enquete, os dados têm que ser lidos do arquivo nesse evento. Um problema introduzido pela forma como foi passado o tipo de ação é que agora o parâmetro passado como valor inicial da tela tem um prefixo, que tem que ser separado do nome do arquivo. Vai ser conveniente criar uma variável global para conter o nome do arquivo.
8 - Crie o conjunto de blocos abaixo em uma área livre do Visualizador:
9 - Em quando TelaPerguntas.Inicializar, adicione o conjunto de blocos com o contorno destacado em amarelo, conforme ilustrado abaixo:
Para entender esse novo conjunto: obter valor inicial recupera o valor do parâmetro passado para essa tela. O bloco se... então... senão testa se esse valor começa com o prefixo "editar:". Se começa, uma variável local é criada para conter as partes separadas pelo primeiro ":" no valor. Você já sabe que a primeira parte será "editar". A segunda parte é o nome do arquivo. O conjunto de blocos iniciado em ajustar global nome_arquivo... guarda esta segunda parte. O bloco seguinte usa o componente Arquivo1 para ler o arquivo de enquete. Se o prefixo não for encontrado, o parâmetro recebido é simplesmente o nome do arquivo, que será utilizado para salvar as perguntas quando a tela for fechada. Então, basta armazenar o parâmetro (contido em obter valor inicial) na variável global nome_arquivo.
Ainda é necessário mais código para tratar a leitura do arquivo de enquete. O processo foi iniciado pelo comando chamar Arquivo1.LerDe. Quando a leitura terminar, um evento será ativado: quando Arquivo1.RecebeuTexto.
10 - Crie o conjunto de blocos abaixo:
No tratamento do evento, um parâmetro contém o texto bruto lido. O comando de tabela csv para lista transforma o texto em uma lista, que é armazenada em perguntas. O bloco se... então que se segue trata o caso de a lista não ser vazia. Neste caso, existe uma pergunta válida na posição de pergunta_atual (que vale 1), que pode ser apagada, e que precisa ser mostrada ao usuário. Daí, os comandos encaixados na cláusula então.
Nos eventos quando btFechar.Clique e quando TelaPerguntas.VoltarPressionado, o código também tem que ser alterado, para utilizar a nova variável com o nome do arquivo ao invés do valor inicial da tela. O código estava duplicado, o que já justificava o uso de um procedimento. Agora, que tem que ser alterado, o incentivo é ainda maior.
11 - Crie um novo procedimento chamado para SalvarArquivoPerguntas, e mova para dentro do novo bloco todo o conteúdo do bloco quando btFechar.CLique. Neste último bloco, que ficou vazio, encaixe um bloco chamar SalvarArquivoPerguntas. Descarte o conteúdo de quando TelaPerguntas.VoltarPressionado, e substitua pelo mesmo bloco chamar SalvarArquivoPerguntas.
11a - No procedimento para SalvarArquivoPerguntas, substitua o bloco obter valor inicial pelo bloco obter global nome_arquivo.
Esses blocos devem estar como abaixo:
O restante do código não precisa mudar. Suas alterações estão prontas.
Testando o Código e Acrescentando Melhorias
É hora de testar seu App. Use o novo botão Editar, na tela 1 do App. Crie enquetes novas, salve e edite. Abra o arquivo resultante e verifique se tudo está conforme as alterações que você fez.Depois de corrigir qualquer erro encontrado, use a opção de menu Projeto/Ponto de controle do App Inventor para salvar esta versão do seu programa, antes de acrescentar melhorias.
O que pode ser melhorado?
Sugestões:
- Documente o código, acrescentando comentários nas partes mais complexas. As explicações abaixo de cada bloco dadas nesse tutorial podem ser a base para os comentários. Melhor ainda se você for capaz de criar os comentários usando suas próprias palavras;
- A transição da primeira para a segunda tela ficou desequilibrada. Quando a ação é de criação, o parâmetro passado não tem prefixo. É só o nome do arquivo. Você acha que pode melhorar isso?
- Durante os testes, aconteceu de você acidentalmente ativar o botão Fechar quando desejava apenas passar à próxima pergunta? Como você melhoraria a interface com o usuário, e o funcionamento do código, para evitar esses acidentes?
- Foi mencionado que a transformação de URI para caminho completo de um arquivo foi baseada na experiência com uns poucos dispositivos. Se não estiver funcionando para você, uma caixa de texto pode ser adicionada à tela 1. Junto com esta caixa de texto, pode ser adicionado mais um botão, para escolher o arquivo. O resultado retornado do Iniciador de atividades pode ser usado para preencher a caixa de texto, e, antes de acionar os botões para abrir a segunda tela, este conteúdo pode ser inspecionado, ou modificado. Você é capaz de fazer esta alteração?
Revisão
Estes foram os conceitos cobertos neste tutorial:- Você usou um componente novo: IniciadorDeAtividades;
- Você criou alterações para incluir funcionalidade em um Aplicativo que já estava completo;
- Você está ganhando autonomia, e aprendendo a criar conjuntos de blocos mais complexos;
- Você tem lido e procurado entender o código que está criando. Isso vai ajudá-lo a ter idéias quando criar seu próprio aplicativo;
Se tiver tempo, procure a documentação do App Inventor, e pesquise o funcionamento de outros componentes. Uma parte da documentação está em Inglês. Se você tem dificuldades com a língua, use o Tradutor do Google, e traduza a página para o Português. Esses recursos melhoram a cada dia, e o texto gerado já tem qualidade bem razoável.
Link para o Aplicativo no AppInventor 2:
ai2.appinventor.mit.edu/?galleryId=4876556954107904
Distribuído sob a licença: Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) : https://creativecommons.org/licenses/by-sa/3.0/deed.pt_BR
Passar ao próximo Tutorial - Enquete










Nenhum comentário:
Postar um comentário