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;
}
}