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

Vamos fazer um carro com o Unity 3D

Neste artigo vamos fazer um carro, simples, com o Unity 3D. A ideia é utilizar o motor de física do Unity 3D para simular o comportamento do carro. Os passos a seguir são: [1] - Criar um projeto novo

C# IEnumerable e IEnumerator

Neste artigo vamos aprender como utilizar a interface IEnumerator por forma a permitir utilizar um ciclo foreach num conjunto ou coleção de dados. A maior parte das coleções (listas e outras) já implementam a interface, mas neste caso vamos personalizar a maneira como percorremos a lista. Quando utilizamos código assim: foreach(Class c in Collection) { ... } O compilador converte este código em algo assim: IEnumerator cc = Collection.GetEnumerator() while(cc.MoveNext()) { c=(Class)cc.Current; ... } Ao implementar a interface IEnumerable significa que a classe implementa uma versão da função GetEnumerator() que deve devolver uma classe que implemente a interface IEnumerator. Vamos explorar um exemplo. Começamos pela classe client Esta classe permitirá guardar os dados dos clientes, existindo um campo para indicar se o cliente ainda está ativo ou não. De seguida temos uma classe que define uma lista de clientes e que implementa a interface IEnumerable que de

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 automaticam