Caso prefira, você encontrará todo esse material, em inglês, no site do Developer Android. A tradução e comentários dos materiais eu faço livremente para ajudar a comunidade que fala português.

segunda-feira, 16 de maio de 2011

NotePad da Área de Recursos - Código Comentado - Parte 01

O aplicativo NotePad da área de recursos do Android serve para se cadastrar notas. Essas notas poderão ser incluídas digitando-se valores diretamente na tela ou poderá criar as notas usando o conteúdo presente no clipboard (área de transferência) do Honeycomb.


Como poderá ver nas telas abaixo, a aplicação não é complexa, apesar do código para se criá-la ser bastante extenso (mas não complicadíssimo de se entender, como poderão acompanhar nas diversas partes dessa análise de código).

Aplicação aberta. Percebam o ícone dele no canto superior esquerdo e as opções no canto superior direito. Na direita há o botão para se criar uma nova nota e um menu de contexto.

Ao se pressionar o menu de contexto, existe a opção de se fazer um PASTE (ou colar) um quaisquer valores que estejam no clipboard do Honeycomb.

Ao se clicar no botão para se criar uma nova nota, a tela acima aparece.

Após se inserir uma nota, ela aparece na tela inicial.

Ao se tocar na nota já existente, a tela de edição da nota aparece, com novas opções no canto superior direito: botão de salvar, de excluir e um menu de contexto para edição de título.

Por fim, a tela onde há a opção de edição do título da nota.

Os campos todos ainda se encontram em inglês. Com o passar do tempo, farei a tradução de tudo para o português para que possamos ter maior noção do que acontece na aplicação.

De qualquer forma, o download do projeto completo poderá ser feito nesse link

Cada vez que o código for sendo atualizado, eu vou colocando novas versões no mesmo link e dizendo por aqui.

Uma vez que o projeto tenha sido carregado no Eclipse, você terá uma imagem semelhante no Package Explorer:


AndroidManifest.xml

O primeiro arquivo a ser analizado é o AndroidManifest.xml. Abaixo, insiro-o com todos os comentários em português:
<?xml version="1.0" encoding="utf-8"?>
<!--
O arquivo de Manifesto serve para declarar os conteúdos dessa aplicação Android
O atributo de namespace traz o namespace da plataforma Android e o pacote supre um nome
único para a aplicação. Quando escrever suas próprias aplicações, o pacote deverá ser mudado de "com.example.*"
para o nome do seu domínio.
 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.notepad" >
    <uses-sdk android:minSdkVersion="11" />
    <application android:icon="@drawable/app_notes"
        android:label="@string/app_name"
    >
        <provider android:name="NotePadProvider"
            android:authorities="com.google.provider.NotePad"
            android:exported="false">
            <grant-uri-permission android:pathPattern=".*" />
        </provider>
        <activity android:name="NotesList" android:label="@string/title_notes_list">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.EDIT" />
                <action android:name="android.intent.action.PICK" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.GET_CONTENT" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
            </intent-filter>
        </activity>
        <activity android:name="NoteEditor"
            android:theme="@android:style/Theme.Holo.Light"
            android:screenOrientation="sensor"
            android:configChanges="keyboardHidden|orientation"
        >
        <!-- Esse filtro diz que podemos ver ou editar dados de uma nota -->
            <intent-filter android:label="@string/resolve_edit">
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.EDIT" />
                <action android:name="com.android.notepad.action.EDIT_NOTE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
            </intent-filter>
<!-- Esse filtro diz que nós podemos criar uma nova nota dentro da pasta de notas.
A ação de INSERT cria uma nova vazia; a ação de PASTE inicializa uma nova nota a partir
do clipboard (área de transferência). Lembre-se que o aplicativo é voltado para o Honeycomb e,
como tal, tem uma área de clipboard mais elaborada. Com isso, caso o usuário tenha
copiado algum texto nessa área, ele poderá virar uma nota na aplicação.
-->
            <intent-filter>
                <action android:name="android.intent.action.INSERT" />
                <action android:name="android.intent.action.PASTE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
            </intent-filter>
        </activity>
        <activity android:name="TitleEditor"
            android:label="@string/title_edit_title"
            android:icon="@drawable/ic_menu_edit"
            android:theme="@android:style/Theme.Holo.Dialog"
            android:windowSoftInputMode="stateVisible">
            <!-- Essa atividade implementa uma ação alternativa que pode ser realizada em novas: edição de título.
            Ela poderá ser usada como operação padrão quando o usuário chama essa ação e está disponível
            como ação alternativa para dados da nota
             -->
            <intent-filter android:label="@string/resolve_title">
            <!-- Essa é a ação que nós realizamos. É uma ação customizada que nós definimos em nossa aplicação e
            não uma ação genérica de VIEW ou EDIT já que não somos um visualizador/editor geral de notas -->
                <action android:name="com.android.notepad.action.EDIT_TITLE" />
                <!-- DEFAULT: executar se for diretamente chamada -->
                <category android:name="android.intent.category.DEFAULT" />
                <!-- ALTERNATIVE: mostrado como uma ação alternativa quando o usuário está trabalhando com esse tipo de dados -->
                <category android:name="android.intent.category.ALTERNATIVE" />
                <!--  -->
                <!-- SELECTED_ALTERNATIVE: mostrado como uma ação alternativa que o usuário pode realizar quando está selecionando esse tipo de dados -->
                <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
                <!-- Esse é o tipo de dados com os quais vamos operar -->
                <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
            </intent-filter>
        </activity>
        <activity android:name="NotesLiveFolder" android:label="@string/live_folder_name"
            android:icon="@drawable/live_folder_notes">
            <intent-filter>
                <action android:name="android.intent.action.CREATE_LIVE_FOLDER" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

O ideal mesmo é abrir o arquivo no seu Eclipse.

Veja que no arquivo são descritos 4 atividades distintas:
  • NotesList
  • NoteEditor
  • TitleEditor
  • NotesLiveFolder

Strings.xml

Já o arquivo strings.xml tem todos as mensagens que serão usadas no aplicativo. Depois de traduzido, o arquivo strings.xml ficará como abaixo:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">NotePad</string>
    <string name="live_folder_name">Notas</string>


    <string name="title_edit_title">Título da Nota:</string>
    <string name="title_create">Nova Nota</string>
    <string name="title_edit">Editar: %1$s</string>
    <string name="title_notes_list">Notas</string>


    <string name="menu_add">Nova Nota</string>
    <string name="menu_save">Salvar</string>
    <string name="menu_delete">Excluir</string>
    <string name="menu_open">Abrir</string>
    <string name="menu_revert">Reverter mudanças</string>
    <string name="menu_copy">Copiar</string>
    <string name="menu_paste">Colar</string>


    <string name="button_ok">OK</string>
    <string name="text_title">Título:</string>


    <string name="resolve_edit">Editar nota</string>
    <string name="resolve_title">Editar título</string>


    <string name="error_title">Erro</string>
    <string name="error_message">Erro ao carregar nota</string>
    <string name="nothing_to_save">Não existe conteúdo a ser salvo</string>
</resources>
No próximo post abrirei cada um dos arquivos XML de layout para mostrar como ele foi criado. Após abrirmos cada um, farei posts separados para cada um dos arquivos .java de controle para a aplicação.

0 comentários:

Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
Related Posts Plugin for WordPress, Blogger...