Avançar para o conteúdo principal

Um bicionário = dicionário com duas línguas

Para este post pensei criar um "bicionário" para Android, isto é, um programa que permite verificar se uma palavra existe em duas línguas, neste caso Português e Inglês.




Depois de pesquisar na Net consegui dois ficheiros de texto com uma lista de palavras, um em português outro em inglês.

Então começamos com a interface, muito simples, duas textviews, uma edittext, dois radio buttons dentro de um radioGroup, por fim um botão.

O código XML é


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="14dp"
        android:text="@string/dicionario"
        tools:context=".MainActivity" />

    <RadioGroup
        android:id="@+id/radioDic"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/textView1" >
        
    <RadioButton
        android:id="@+id/radioButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="@string/pt" />
        
    <RadioButton
        android:id="@+id/radioButton2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="false"
        android:text="@string/ing" />
    
 </RadioGroup>

   <EditText
       android:id="@+id/editText1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentLeft="true"
       android:layout_below="@+id/radioDic"
       android:ems="10"
       android:inputType="text" >
    
        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button1"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/editText1"
        android:layout_alignBottom="@+id/editText1"
        android:layout_alignParentRight="true"
        android:onClick="bt_verificar"
        android:text="@string/botao" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button1"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

Para que o código possa ler os ficheiros temos de os colocar nas pasta res\raw. Os ficheiros colocados nesta pasta são mantidos inalterados dentro da estrutura do projeto.

Quando o botão Verificar é clicado temos de ler o ficheiro correspondente ao dicionário escolhido e procurar a palavra inserida.

Para tal criamos uma função que recebe a palavra e a opção pelo dicionário e devolve true ou false em função como resultado da pesquisa.

private boolean encontra(String palavra,int dic){
    boolean resultado;
    InputStream is;
   
    if(dic==0)
      //carrega dicionario PT
    is = getResources().openRawResource(R.raw.portugues);
    else
    is = getResources().openRawResource(R.raw.ingles);
   
    Scanner pesquisa=new Scanner(is);
    Log.d(TAG,"Português!");
    resultado=false;
    while(pesquisa.hasNext()){
String linha=pesquisa.nextLine();
linha=linha.toLowerCase();
if(linha.equals(palavra)){
resultado=true;
break;
}
    }//while
    pesquisa.close();
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    return resultado;
    }

O problema começa quando tentamos pesquisar uma palavra e o sistema operativo indica que o programa não está a responder, isto devesse ao tempo que demora a percorrer o ficheiro, assim foi necessário criar uma thread para que esta função seja executada em background enquanto mantemos na interface uma animação que indica que a pesquisa está a decorrer.

Esta é a função que é chamada quando o botão Verificar é clicado:
    //botão para verificar palavra
    public void bt_verificar(View view){
    Runnable runnable=new Runnable(){
    public void run(){
EditText texto=(EditText)findViewById(R.id.editText1); //texto introduzido
final Button bt =(Button)findViewById(R.id.button1); //botão verificar
final TextView mensagem=(TextView)findViewById(R.id.textView2); //textview para mostrar mensagem
int l=0;
if(texto.getText().length()==0){
showMessage("Introduza uma palavra a pesquisar!");
return;
}//if
String palavra=texto.getText().toString();
palavra=palavra.toLowerCase();
Log.d(TAG,"A pesquisar " + palavra);
RadioButton rbDicionario=(RadioButton)findViewById(R.id.radioButton1);  //botão radio
if(rbDicionario.isChecked())
l=0; //português
else
l=1; //inglês
handler.post(new Runnable() {
public void run() {
bt.setEnabled(false);
setProgressBarIndeterminateVisibility(true);
mensagem.setText("A Pesquisar...");
}
 });
if(encontra(palavra,l)){
handler.post(new Runnable() {
 //  @Override
public void run() {
bt.setEnabled(true);
setProgressBarIndeterminateVisibility(false);      
mensagem.setText("Palavra encontrada!");
showMessage("Palavra encontrada!");
}
 });
}else{
handler.post(new Runnable() {
 //  @Override
public void run() {
bt.setEnabled(true);
setProgressBarIndeterminateVisibility(false);           
mensagem.setText("Palavra não encontrada!");
showMessage("Palavra não encontrada!");
}
 });
}
    }
    };
    new Thread(runnable).start();
    }

Ao executar este código numa thread é necessário criar uma handler para podermos atualizar a interface do utilizador.

Na interface também foi adicionada por código uma progressBar que aparece e desaparece de acordo com o código que está a ser executado.

O código completo da aplicação fica assim:
package edu.pjcferreira.bicionario;

import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
private Handler handler;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        
        setContentView(R.layout.activity_main);

        setProgressBarIndeterminateVisibility(false);
        handler= new Handler();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    
    private void showMessage(CharSequence text){
    Context context=getApplicationContext();
    int duration=Toast.LENGTH_SHORT;
    Toast toast=Toast.makeText(context, text, duration);
    toast.show();
    }
    //botão para verificar palavra
    public void bt_verificar(View view){
    Runnable runnable=new Runnable(){
    public void run(){
EditText texto=(EditText)findViewById(R.id.editText1); //texto introduzido
final Button bt =(Button)findViewById(R.id.button1); //botão verificar
final TextView mensagem=(TextView)findViewById(R.id.textView2); //textview para mostrar mensagem
int l=0;
if(texto.getText().length()==0){
showMessage("Introduza uma palavra a pesquisar!");
return;
}//if
String palavra=texto.getText().toString();
palavra=palavra.toLowerCase();
Log.d(TAG,"A pesquisar " + palavra);
RadioButton rbDicionario=(RadioButton)findViewById(R.id.radioButton1);  //botão radio
if(rbDicionario.isChecked())
l=0; //português
else
l=1; //inglês
handler.post(new Runnable() {
public void run() {
bt.setEnabled(false);
setProgressBarIndeterminateVisibility(true);
mensagem.setText("A Pesquisar...");
}
 });
if(encontra(palavra,l)){
handler.post(new Runnable() {
 //  @Override
public void run() {
bt.setEnabled(true);
setProgressBarIndeterminateVisibility(false);      
mensagem.setText("Palavra encontrada!");
showMessage("Palavra encontrada!");
}
 });
}else{
handler.post(new Runnable() {
 //  @Override
public void run() {
bt.setEnabled(true);
setProgressBarIndeterminateVisibility(false);           
mensagem.setText("Palavra não encontrada!");
showMessage("Palavra não encontrada!");
}
 });
}
    }
    };
    new Thread(runnable).start();
    }

    private boolean encontra(String palavra,int dic){
    boolean resultado;
    InputStream is;
   
    if(dic==0)
      //carrega dicionario PT
    is = getResources().openRawResource(R.raw.portugues);
    else
    is = getResources().openRawResource(R.raw.ingles);
   
    Scanner pesquisa=new Scanner(is);
    Log.d(TAG,"Português!");
    resultado=false;
    while(pesquisa.hasNext()){
String linha=pesquisa.nextLine();
linha=linha.toLowerCase();
if(linha.equals(palavra)){
resultado=true;
break;
}
    }//while
    pesquisa.close();
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    return resultado;
    }
}

Fica aqui o projeto e a aplicação.

Comentários

Mensagens populares deste blogue

Upgrade do Windows Home para Pro sem formatar

 Há algum tempo que tentava fazer o upgrade do meu Windows 10 da versão Home para a versão Pro, mas chegava sempre a um ponto em que me era solicitado para formatar o sistema e não estava para isso. Finalmente conseguinte seguindo estes passos: - seguinte estes passos  utilizei uma das chaves genéricas para o Windows 10 Pro e fui a Settings > Update & Security > Activation > Change the product key; - após inserir uma das chaves o Windows instala as funcionalidades Pro e pede para reiniciar; - agora tem o Windows Pro mas não está ativado, assim fui ao site urcdkeys  onde comprei uma chave para o Windows Pro por menos de €20; - com essa chave voltei a funcionalidade Change the product key e ativei o Windows; - e pronto, Windows Pro ativado sem formatar ou reinstalar. Importante : eu não tenho nada a ver com o site urcdkeys por isso a vossa experiência pode correr de forma diferente da minha.

PONG em Flash AS3.0

Mais um pequeno jogo para demonstrar algumas das funcionalidades do AS3.0. Para este exemplo vamos implementar uma versão do Pong. Para este Pong vamos criar a possibilidade de acelerar a bola com a raqueta e, para tornar o jogo mais difícil, quando se atingir uma determinada pontuação fazemos aparecer uma parede no meio do campo de jogo. O código é muito parecido com o jogo do post anterior, mas um pouco mais complicado. Para controlar a nossa raqueta utilizamos a seguinte função: function teclado(e:KeyboardEvent):void{ dir_j1=0; if (e.keyCode == Keyboard.UP){ if(jogador1.y>0) jogador1.y -=5; dir_j1=-5; } if (e.keyCode == Keyboard.DOWN){ if(jogador1.y<370) jogador1.y +=5; dir_j1=5; } } Agora está mais simples pois só percorremos as linhas, ou seja, a coluna nunca muda. A raqueta que é controlada pelo computador depende do seguinte código: function movepc():void { if (bola.y>jogador2.y) jogador2.y = jogador2.y + velocidade_y; if (bola.y<jogador2.y) joga...

React - Introdução

 Neste post vamos fazer uma breve introdução ao React. React é uma framework javascript e por isso é importante ter conhecimentos desta linguagem de programação para melhor compreender o seu funcionamento. O que é necessário? Para construir páginas com React é necessário ter instalado a framework Node e o seu instalador de packages o npm. Com o Node instalado basta abrir uma janela da linha de comandos, eu aconselho utilizar o novo Windows Terminal ou o Cmder . Na sua linha de comando escolhida execute o comando: npx create-react-app Tutorial01 Este comando vai criar uma pasta com o nome Tutorial01 e instalar dos os ficheiros necessários para construir a sua primeira aplicação React dentro dessa pasta. De seguida entramos na pasta criada com o comando: cd Tutorial01 E iniciamos a aplicação com o comando: npm start Deve conseguir ver uma página com o seguinte aspeto: A partir daqui, até fechar a linha de comando, todas as alterações feitas aos ficheiros da sua aplicação são automat...