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.

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

Tem troco

Para hoje um pequeno programa que dá troco, bem dar não dá mas calcula o troco a dar em função das moedas disponíveis. Neste projeto vamos utilizar o novo Visual Studio 2012. Como era de se esperar vamos iniciar um projeto novo: Agora adicionamos os seguintes elementos:  - um botão para calcular as moedas a dar de troco  - um botão para repor o número de moedas iniciais disponíveis  - uma textbox para introduzir o valor a pagar  - uma textbox para introduzir o valor entregue  - umas labels para informar o utilizador do que deve introduzir e outra para mostrar o troco  - por fim uma grelha para mostrar os valores das moedas e as quantidades disponíveis de cada uma. A janela principal do programa fica assim: Agora o código, primeiro o evento load do formulário, neste vamos definir os valores das moedas e as respetivas quantidades Para guardar estes valores vamos necessitar de uma variável definida ao nível do formulário, logo abaixo da definição da class: Public Class Form1     Public mo