PplWare Mobile

Aprenda a programar para Android – Parte III

                                    
                                

Este artigo tem mais de um ano


Autor: Pplware


  1. Carlos Silva says:

    Isso ficava mesmo bem era um “switch case” no onClick

    • Miguel Ribeiro says:

      return true;

    • Christian Göllner says:

      Penso que um switch fica melhor quando há muitas opções.

    • Viperz0r says:

      switch para 2 comparações ? não vale o esforço.

      • Sergio says:

        esforço?!?!! Mais simples, código mais legível

        Um switch normalmente os compiladores conseguem melhores optimizações (no vb nem por isso)

      • Sergio says:

        esforço?!?!! Mais simples, código mais legível

        Um switch normalmente os compiladores conseguem melhores optimizações (no vb nem por isso)

        • Christian Göllner says:

          Tentar optimizar código através de switch em vez de if.. else não é todo a melhor abordagem. Aquilo que se tem de evitar são as complexidades quadráticas ou exponênciais. Neste pequeno tutorial todo o código tem uma complexidade linear logo não há por onde optimizar. O que mais custa a este programa são mesmo as operações de desenhar no ecrã. No entanto como isso é feito pelo Androide não há maneira de controlarmos isso.

          • Sergio says:

            tentava responder a questão de esforço: O esforço pode ser mais complicado programar, ou esforço computacional. O esforço computacional traduz-se no numero de instruções assembler. Por exemplo, os compiladores em C são altamente eficientes em switch. Concordo que isso é pouco importante num tutorial. Estava apenas a responder a um lado da questão relativamente à questão esforço.
            Num tutorial o importante é legibilidade. E aí não consigo entender a palavra esforço. Com um switch terás de escrever menos código, portanto o esforço é menor. Num switch a programação está mais estruturada, logo mais legivel. Num if then else tens de ler a primeira condição lógica e depois fazeres um pequeno raciocinio mental para o else. Num switch está lá escarrapachado as duas condições (e como disse com menos código)

            Como já disse isso é pouco importante para o tutorial (ou não). Não consigo é perceber como podem argumentar a esforço

      • Carlos Silva says:

        Não é pelo esforço, é pela educação que se está a dar.
        Estão a dar o exemplo de associar todos os eventos onClick com uma só função e depois metem-lhe um switch disfarçado de if-then-else-if para controlo. Como deve de ser, legível, perceptivel, e tudo mais, é um switch. Nestes casos, if-then-else-if, só quando não é possível usar o switch (por exemplo com strings)

        • Christian Göllner says:

          Pela educação que se está a dar? Se vamos ser assim tão piquinhas também não se diz “função” quando se está a falar em programação orientada a objectos, mas sim “método”.
          Switch disfarçado de if-then-else? É tudo uma questão de gosto pessoal. Não há regras que digam quando é que se tem de usar um ou outro. Em nenhum livro de programação que tenha lido isso está definido.

          • Carlos Silva says:

            O que achas que alguém vai fazer quando pegar no teu código para alterar? Acrescentar mais um else-if ou trocar por um switch? Daqui a pouco aquilo fica uma salganhada…
            E eu não falei em regras estruturais de programação, falei em *legibilidade*
            é *muito* mais facil ler um switch do que uma cadeia de ifs

            switch (valor) {
            case 1:
            //…
            case 2:
            //…
            case 3:
            //…
            }

            if (valor == 1) {
            } else if (valor == 2) {
            } else if (valor == 3) {
            }

            ^^^^ Onde é que mais *facilmente* vês os valores possíveis de “valor” ?????
            Mais uma vez digo, não tem nada a ver com optimizações nem nada do género é mesmo *legibilidade* e facilidade de alterações

      • Carlos says:

        Gosto da discussão, mas eu diria o seguinte. Switch só a partir de 3 comparações senão a performance é bem inferior ao If…
        E para mim, isso sim é importante. Deixem lá a parte do legível para 2º plano.

    • Ricardo Amaral says:

      Vocês percebem tanto de programação Android como eu de culinária…

      O Carlos Silva tem razão. Na frase dele friso as seguintes palavras por ordem, “ficava”, “bem”, “switch” e “onClick” e para bom entendedor, meia palavra basta.

      Isto não se trata de ter mais que 3 opções ou muitas mais, nem tão pouco se trata de optimização de código. Optimizar uma estrutura de controlo com 2 ou 3 casos para ganhar uns milissegundos? Isso tem um nome, Optimização Prematura (http://en.wikipedia.org/wiki/Premature_optimization).

      Trata-se somente da legibilidade do código. E no contexto do método onClick em programação para Android faz muito mais sentido um switch que if-elseif.

      Ali está-se a perguntar “de entre os botões existentes, qual foi o carregado?” e esta pergunta faz-se com um switch. Enquanto que a pergunta que um if-elseif faz é mais do estilo “carregou no botão x? ou carregou no y? ou carregou no…”. Agora pensem lá qual é a estrutura de controlo que faz mais sentido **no contexto do onClick em Android**.

      • Diz me sinceramente, o resultado final é o mesmo ou não? Tanto burburinho por causa de um if…else e o switch, um iniciante em programação para Android não estará muito interessado em saber qual dos dois métodos “faz mais sentido”.

        • Ricardo Amaral says:

          Se não está interessado, devia. Se quer aprender, ao menos que aprenda direito e não com cola e cuspe. É que o resultado destas “aprendizagens” é mais tarde ou mais cedo cometerem erros básicos porque foram preguiçosos e preferiram aprender as coisas em cima do joelho.

          É por estas e por outras que depois temos por aí pessoal a achar-se programador porque aprendeu a fazer um “hello world”.

        • Carlos Silva says:

          se o resutado é o mesmo?! Ele até podia esquecer os XMLs todos que tem definidos e meter tudo numa classe que o resultado seria o mesmo… agora legivel…

          • Mafalda says:

            Querido Carlos,

            se me perguntarem se gosto mais de escrever com caneta azul ou preta, diria que prefiro azul. Significa isso que quem escreve com caneta preta está a fazer as coisas mal? Não. Simplesmente prefere escreve a preto.
            Se a diferença é mínima e o resultado das coisas for o mesmo porque não podemos faze-las à nossa maneira?

            Tenho pena que toda esta discussão seja por uma questão de gosto pessoal…

      • Christian Göllner says:

        Tenho a dizer que estudo desenvolvimento de software há 3 anos e acho simplesmente triste o principal tema de discussão deste tutorial ser o uso de um switch ou de um if.. else. Como programador profissional tem-se preocupações bem mais importantes do que se se deve usar um switch ou não. É muito mais importante fazer-se uma boa análise e desenho de software. Fazer um bom modelo de domínio, definir bem as classes. Que classes devem ter quais responsabilidades. Isso sim, trás-nos software reutilizavel, escalavel e coeso.
        Discutir pormenores como o uso de um switch ou não vos vai fazer criar software melhor, isso garanto-vos.

        • Ricardo Amaral says:

          O Carlos fez uma mera observação sem fazer criticas ou dar grandes justificações. Tu, entre outros, é que foram os que incitaram a discussão do switch vs if-elseif. Um bocado irónico esse teu comentário.

          • Christian Göllner says:

            Não quero discussões. A razão pela qual fiz o tutorial foi para ajudar pessoas o melhor que eu conseguia a fazer uma aplicação simples e prática. Agradeço todos os comentários e espero que continuem a ler os meus tutoriais.

        • Carlos Silva says:

          Não te querendo tirar o mérito, se és estudante de desenvolvimento há 3 anos, eu sou programador profissinal a caminho dos 12 anos, e amador perto dos 15.
          Já muita gente leu o meu código e muita gente o há de ler. E programar só para mim, não é a mesma coisa que programar para o “mundo”.
          Mais uma vez, não é uma questão de optimização, reutilização, eficácia, you-name-it, é *legibilidade*!!!
          Mais nada.

  2. Blizard says:

    Obrigado!
    Bom tuturial!

  3. Escrifonife1 says:

    Vou guardar esses tutoriais para depois…

    Estou entrando nessa área de programação para Android mais estou usando o Necessitas para programar…

    Alguém mais já ouvir falar dele?

  4. Ed says:

    Também há opção de criar na classe que estende Activity um método que recebe uma view, e no xml definir o campo onClick do botão com o nome do método.
    Por norma é assim que faço, qual das duas a melhor? É uma questão de preferência ou uma têm vantagens em relação a outra?

    • Christian Göllner says:

      Para mim é uma questão de preferência apenas.

    • Carlos Silva says:

      Pessoalmente declaro directamente em código e quando especifico o onClick. Assim:

      button.setOnClickListener(new onClickListener) {
      public boolean onClick(View v) {
      // Do something
      // …
      if (handled_click)
      return true;
      else
      return false;
      }
      });

      Exemplo básico.
      Pessoalmente gosto assim, mas usar o onClick na activity também não me choca. No XML já me choca mais um bocado porque normalmente lê-se o código e o XML fica para último e depois andamos às aranhas à procura do setOnClickListener no código e ele não está lá 🙂 Mas só por isso mesmo… 😛

    • Christian Göllner says:

      Lembrei-me agora de uma vantagem ao usar Java em vez de xml. Imagine que quer utilizar o mesmo layout para várias classes ou mesmo vários projectos. Nesse caso tem-se que mudar o xml todas as vezes. Se usasse o Java para definir o método de callback, poderia simplesmente copiar o ficheiro .xml para onde quisesse que não teria de alterar nada nele.

  5. cris says:

    As imagens não estão bem colocadas..

  6. Nelson João says:

    Ter tantos textView seguidos não é uma boa politica de programação no xml, é preferível ter só uma textview e utilizar um StringBuilder ou até mesmo uma única String para apresentar esses resultados, para além de simplificar a leitura do utilizador, também se torna fácil a programação.

    Contudo o tutorial é bastante interessante e ajuda os utilizadores a iniciar a programação para Android.
    Continuem pessoal 🙂

    Alguma dúvida podem contactar-me por e-mail.

    Já agora deixo aqui umas aplicações que poderão gostar:
    https://market.android.com/details?id=com.viatecla.nicereader&feature=search_result#?t=W251bGwsMSwxLDEsImNvbS52aWF0ZWNsYS5uaWNlcmVhZGVyIl0.

    https://market.android.com/details?id=com.magics.swipecarts&feature=search_result#?t=W251bGwsMSwxLDEsImNvbS5tYWdpY3Muc3dpcGVjYXJ0cyJd

    A primeira tem sido trabalho da empresa e a segunda foi elaborada por mim.

    • Christian Göllner says:

      Se tivesse só um TextView como é que definia as cores e tamanhos?

      • Nelson João says:

        Para o tamanho utilizava a função Html.fromhtml(…), provavelmente também seria possível atribuir várias cores diferentes, mas como não tenho a certeza se dá para atribuir várias cores diferentes então sugiro as várias textview embora não deixe o código limpo.

        Senão outro método é adicionar a textview em java, cria-se um container e adiciona-se a mesma textview várias vezes, mas com parâmetros diferentes.

        • Christian Göllner says:

          Isso tudo não tornaria a coisa mais complicada no final?
          Eu pessoalmente também não sou fã do xml no Android. No entanto penso que definir os TextViews todos directamente no xml é mais fácil de perceber para quem está a aprender. Usar “maroscas” como o Html.fromHtml(..) ou criá-los programáticamente via Java é mais complicado e é estar a desincentivar o uso da Api disponibilizada pelo pessoal do Android. Além de que sempre me disseram que é boa prática separar a lógica da aplicação (java) da apresentação da aplicação (xml).

          • Nelson João says:

            Mas Api do Android para xml’s simples funciona, mas quando a estrutura é mais complexa e o programador fica com problemas na apresentação da aplicação.
            A criação de uma textview no xml é bastante simples e fácil de perceber.

            Eu considero api que desenha o xml bom para aprender os conceitos basicos dos objectos com os seus eventos.

            Mais tarde será melhor passar algumas coisas para o java.

    • Christian Göllner says:

      Ah e obrigado pelo elogio claro 😀

      • Nelson João says:

        Só dei uma ideia, é claro que a forma que implementas-te é bastante fácil para um iniciante começar a programar, assim separas-te tudo e talvez alguns tutoriais dão uma ideia errada aos iniciantes por implementarem as ideias parecidas como as minhas num tutorial.

        Não estava a pensar no tutorial como ele deve ser.
        Continuo com a minha ideia fixa, mas isso também pode ser por gosto.

        Sempre que tiver alguma dúvida vou te contactar =p.

        Detectei que o android não faz escala ao video quando alteramos de portrait para landscape, acabei de implementar uma solução que corrige isso, mas acredito que existam outras, por isso se descobrires partilha =p.

    • Ricardo Amaral says:

      Mais uma daquelas discussões onde só existe desinformação…

      “Ter tantos textView seguidos não é uma boa politica de programação no xml”

      Gostava que me indicasses a tua fonte para tal afirmação. Cada uma daqueles Views representam um elemento diferente, só faz sentido que sejam independentes e não uma única View para depois se usar o Html.fromhtml(). Já paraste para pensar na complexidade que estás a introduzir desnecessariamente?

      “além de simplificar a leitura do utilizador”

      Desde quando é que o utilizador lhe interessa se foram usadas 1001 Views ou apenas uma com recurso ao StringBuilder?

      “também se torna fácil a programação”

      Errado, torna-se mais complexa sem necessidade. Usares uma View com HTML vais ter de preocupar as tags necessárias para manteres o mesmo aspecto que se vê no screenshot aqui no tutorial. E gostava de perceber onde é que a programação se torna difícil usando o método apresentado no tutorial.

      “Eu considero api que desenha o xml bom para aprender os conceitos basicos dos objectos com os seus eventos.

      Mais tarde será melhor passar algumas coisas para o java.”

      What!? Sabes o que é um LayoutInflater? Sabes qual é o propósito do código XML? Parece-me que não…

      O código XML é somente para facilitar a construção de layouts. Tens uma linguagem standard e estruturada que te permite facilmente definir todo o tipo de elementos e os seus atributos. É uma linguagem fácil e rápida de aprender e escrever. Com ela consegue-se facilmente desenhar um layout em Android.

      E o LayoutInflater faz por ti esse trabalho de “passar as coisas para Java”. Não passa propriamente para Java porque estamos a falar em runtime. O que ele faz é interpretar o XML e dinamicamente construir o layout. Ou seja, com uma linha faz aquilo que tu queres fazer sabe-se lá em quantas linhas.

  7. Nuno Gonçalves says:

    Bom tutorial, parabens 😉

    • Christian Göllner says:

      Obrigado Nuno. Espero que os meus tutoriais continuem a ser interessantes e que os continue a ler. Se quiser dar ideias para o próximo tutorial, não hesite!

  8. Pedro Veloso says:

    Parabéns pelo tutorial. Eu sei que o público alvo deste guia são iniciantes, mas faria alguns reparos que apesar de não tornarem o programa mais eficiente são boas práticas de se adquirir:

    * Substituir o “>” por simplementes “/>” fica mais curto e de acordo com a especificação para um elemento XML que não tem conteúdo

    * As variáveis de class deveriam seguir a especificação de Android em começarem pela letra “m”, ou seja

    “private EditText numeroUm;”

    passa a ser:

    “private EditText mNumeroUm;”

    Este e outros standards estão definidos aqui: http://source.android.com/source/code-style.html , neste caso refiro-me ao “Follow Field Naming Conventions”. Estes standards são específicos a Android no âmbito Java.

    Já agora quanto os vários elementos TextView uma optimização possível seria agrupar 2 Tv (o de título e o de resultado referente a esse título) num e reutilizar esse novo elemento com o das layouts. Assim reduzi-se para metade (mais ou menos) a quantidade de código XML e se um dia quisesses alterar o formato desses elementos só se faria a alteração num único sitio.

    • Pedro Veloso says:

      Eu no primeiro ponto estava a referir-me a /Button , mas como foi numa página web o conteúdo ficou escondido por ter escrito o primeiro “menor” 😛

    • Christian Göllner says:

      Obrigado Pedro 🙂

      Em relação aos reparos:

      Eu costumo fazer sempre com o “/>”. Também concordo que o “/>” é o correcto para um elemento XML que não tem conteúdo. Foi mesmo uma distracção.

      Em relação à convenção dos nomes da variaveis, já conhecia essa de colocar um “m”. Vem de “member”, para sabermos que a variavel é membro da nossa classe. No entanto nunca cheguei a adoptar essa convenção penso que por uma questão de preguiça.

      Não percebi bem a parte dos TextViews. Se juntar 2 Tv em um (título e resultado) estes vão ficar com o mesmo aspecto (cor e tamanho). Há uma coisa que é definir estilos ( do género css para html) em que se separa o conteúdo da apresentação. Assim também se reduz a quantidade de código e aumenta-se a legibilidade. Isso talvez fique para o próximo tutorial.

  9. HM says:

    Uma questão offtopic, e se em vez do emulador, eu quiser ver a aplicação no telf? como posso fazer?

    Aproveito para dar os parabéns pelo fantástico post….

    • Christian Göllner says:

      Em primeiro lugar, obrigado pelo elogio 🙂

      Vou citar e resumir um pouco as instruções definidas pela Google definidos aqui:http://developer.android.com/guide/developing/device.html

      Os passos são os seguintes:
      1- Ligar “USB debugging” no telefone. (Depuramento USB em português??)
      No telefone, ir a Settings->Applications->Development->USB Debugging. (Definições->Aplicações->Desenvolvimento->Depuramento USB)

      No Android 4.0 a definição está em Settings->Developer options. (Definições->Opções Desenvolvedor ?)

      2- É necessário instalar drivers USB para o adb.
      – MacOS : Simplesmente funciona, não é preciso fazer nada.
      – Windows: Seguir este link http://developer.android.com/sdk/oem-usb.html

      – Linux : Descobrir o USB Vendor ID que está definido aqui: http://developer.android.com/guide/developing/device.html#VendorIds . Fazer login como root e criar o ficheiro /etc/udev/rules.d/51-android.rules . Usar o formato seguinte para adicionar o id: SUBSYSTEM==”usb”, ATTR{idVendor}==”0bb4″, MODE=”0666″, GROUP=”plugdev” . Neste exemplo o vendor é HTC. O MODE é read/write e GROUP define o grupo Unix. Executar o comando chmod a+r /etc/udev/rules.d/51-android.rules .

      Reiniciar o eclipse (ou iniciar se desligado) e quando se for a escolher qual aparelho utilizar para arrancar a aplicação Android já deve constar o aparelho ligado via USB.

      Para quem quiser ver o guia oficial da Google: http://developer.android.com/guide/developing/device.html

  10. DMM says:

    Não funciona…

    • Christian Göllner says:

      Isso é muito vago… Em que parte não funciona?

      • Filipe Santos says:

        @Christian Göllner tenho uma questão a fazer-te e aguardarei a tua resposta por isso.

        Tenciono tirar o curso de programação Android mas cancelaram o curso de POO por falta de gente. Logo Sendo eu programador php, ter estudado com VB e Pascal Zim, será complicado ir para o curso de Android sem o de POO?

        Ou bastará eu dar um estudo no oracle sobre Java?

        Cumprimentos e Obrigado!

  11. Amauri says:

    Você está de parabéns!!! É difícil encontrar tutoriais com boa didática.

  12. MrT says:

    Como é que se consegue exportar uma aplicação criada por nos?

  13. Telma says:

    Estou a seguir este tuturial e não quando faço o

    public void onClick(View v) {



    }

    Dá um erro que diz “void is an invalid type for the variable onclick” já andei a pesquisar, mas não consigo resolver :/
    Será que alguém podia dar uma ajudinha?

  14. Mário Sérgio says:

    Gostei muito do tutorial, agora e se querer mudar as cores dos botões e da tela como faço?

Deixe um comentário

O seu endereço de email não será publicado.

You may use these HTML tags and attributes: <a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

Aviso: Todo e qualquer texto publicado na internet através deste sistema não reflete, necessariamente, a opinião deste site ou do(s) seu(s) autor(es). Os comentários publicados através deste sistema são de exclusiva e integral responsabilidade e autoria dos leitores que dele fizerem uso. A administração deste site reserva-se, desde já, no direito de excluir comentários e textos que julgar ofensivos, difamatórios, caluniosos, preconceituosos ou de alguma forma prejudiciais a terceiros. Textos de caráter promocional ou inseridos no sistema sem a devida identificação do seu autor (nome completo e endereço válido de email) também poderão ser excluídos.