AutoCompleteTextView no Android, Entendendo e Utilizando

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /AutoCompleteTextView no Android, Entendendo e Utilizando

AutoCompleteTextView no Android, Entendendo e Utilizando

Vinícius Thiengo
(7958) (13)
Go-ahead
"O método consciente de tentativa e erro é mais bem-sucedido que o planejamento de um gênio isolado."
Peter Skillman
Prototipagem Android
Capa do curso Prototipagem Profissional de Aplicativos
TítuloAndroid: Prototipagem Profissional de Aplicativos
CategoriasAndroid, Design, Protótipo
AutorVinícius Thiengo
Vídeo aulas186
Tempo15 horas
ExercíciosSim
CertificadoSim
Acessar Curso
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Lendo
TítuloCraftsmanship Limpo: Disciplinas, Padrões e ética
CategoriaDesenvolvimento Web
Autor(es)Robert C. Martin
EditoraAlta Books
Edição
Ano2023
Páginas416
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Opa, blz?

Nesse vídeo mostro algumas maneiras de como utilizar o componente visual AutoCompleteTextView no Android. Apresento quetro maneiras, sendo que as duas primeiras são muito próximas e o que diferencia as duas últimas é a bus sendo realizada em um servidor Web em uma delas. Note o uso de arrays que foram definidos no xml do Android (mais precisamente no string.xml) para separar a visão da lógica. A lista de objetos State foi inevitável, então persistir com ela na MainActivity. A utilização da interface Filterable é para informar ao adapter que nós iremos implementar um filtro para os dados, o Filterable não necessáriamente deve ser utilizado somente no contexto no AutoCompleteTextView, você pode utilizá-lo em outras situções que haja a necessidade de filtro também, até mesmo um simples ListView. Como informado, o Filterable apenas informa que iremos realizar um filtro, mas é com a implementação do Filter que nós definimos nosso filtro personalizado na lista. Lembrando que o método performFiltering() da calsse abstrata Filter roda já em uma Thread diferente da Thread principal ou Thread UI, sendo assim aproveitei essa "jogada" para já realizar a conexão com o servidor Web nesse método, assim não foi necessária outro script para realizara chamada dos dados na Web. O retorno do método performFiltering() é direcionado para o método publishResults() que no caso já roda na Thread principal novamente. Fique atento na parte que utilizo uma flag chamada id para controlar a apresentação do DropDown do AutoCompleteTextView quando em conexão Web, pois como informado no vídeo, a chamada ao método performFiltering() cria uma nova Thread, mas não desliga a anterior, e a nova Thread fica na fila eseperando a finalização da Thread anterior para então começar a ser processada. Coloquei o TextWatcher para acompanharmos tudo que está sendo digitado no AutoCompleteTextView, mas ele pode ser utilizado em outras Views que permitem entrada de dados, como o próprio EditText, por exemplo. Vou evitar mais delongas e deixar você assistir ao vídeo.

O link para download do projeto, incluindo arquivo php, se encontra logo abaixo no post.

Segue links dos vídeos que podem lhe ajudar a compreender melhor algumas entidades utilizadas no projeto do vídeo:

Spinner (ou Select) no Android, Entendendo e Utilizando

Utilizando BaseAdapter Para Personalização Completa da ListView

Parser JSON no Android, Entendendo e Utilizando

Volley no Android, Entendendo e Utilizando

Segue link das páginas apresentadas no vídeo:

Página da View AutoCompleteTextView no site oficial do Android

Página da interface Filterable na site oficial do Android

Página da classe abstrata Filter no site oficial do Android

Vlw

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

Google Plus API no Android, Realizando LoginGoogle Plus API no Android, Realizando LoginAndroid
Compartilhamento e Lista de Usuários Com Google Plus API no AndroidCompartilhamento e Lista de Usuários Com Google Plus API no AndroidAndroid
Application Class no Android, Entendendo e UtilizandoApplication Class no Android, Entendendo e UtilizandoAndroid
Box de Informação Com PopupWindow no AndroidBox de Informação Com PopupWindow no AndroidAndroid

Compartilhar

Comentários Facebook

Comentários Blog (13)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Levi Saturnino (1) (0)
01/04/2018
Estou fazendo uma pesquisa pelo banco de dados para popular o meu autocomplete, ao digitar alguns números no campo do autocomplete quando faço o debug a minha lista que preenchi o adapter vem uma certa quantidade, mas o meu autocomplete não aparece o dropdown ao digitar numero, só aparece quando eu digito letras. Isso é assim mesmo ou tem alguma configuração que precisa fazer para conhecer quando for numero?
Responder
Vinícius Thiengo (0) (0)
02/04/2018
Levi, tudo bem?

Ainda não enfrentei este problema. Logo a primeira dúvida é se quando há o teste com números, se nos logs do Android Studio algum Warning é apresentado? Se sim, quais?

Encontrei este problema, mais generalizado, com o AutoCompleteTextView: https://stackoverflow.com/questions/10753336/autocompletetextview-not-showing-any-drop-down-items

E essa solução: https://stackoverflow.com/a/10815032/2578331

Veja se funciona para o seu domínio também. Qualquer coisa volte aqui.

E lembre que no Android-Arsenal sempre tem uma série de APIs de AutoComplete que pode lhe ser útil: https://android-arsenal.com/tag/240?sort=rating

Abraço.
Responder
Robson (1) (0)
29/09/2017
Olá Thiengo tudo ok?
Prezado estou pondo em pratica o AutoComplete, motivo tenho uma lista grande para o usuário então sai do Spinner e estou conhecendo este AutoComplete, mais como faz para a lista aparecer em baixo do componente e não acima? aqui ele só quer aparecer no Topo, e cara tudo bem estou vendo que este é o que vou ter que fazer uso mais infelizmente o Spinner seria melhor porque agora eu tenho que controlar se o que o cara digitou ali existe no banco.
Responder
Vinícius Thiengo (0) (0)
04/10/2017
Robson, tudo bem aqui.

Veja se alguma das opções mais avançadas de Spinner do link a seguir lhe ajudam com isso: https://android-arsenal.com/tag/211?sort=rating

Provavelmente tem alguma justamente para Spinners com centenas de itens.

A seguir também deixo o link das APIs de AutoComplete caso nenhuma de Spinner seja útil ao seu projeto Android: https://android-arsenal.com/tag/240?sort=rating

Abraço.
Responder
19/08/2016
Thiengo, tenho uma dúvida sobre o EditText. Estou usando dois EditText para pegar dois parâmetros, nome e ip, para guardar em um banco de dados do aplicativo e ir para outra activity. Porém, ao colocar o nome e o ip o aplicativo fecha e no log aparece um aviso "W/IInputConnectionWrapper: showStatusIcon on inactive InputConnection".  Eu n abri um inputMethod no na minha classe. Pelo que sei esse aviso só aparece quando a conexão com o cursor da activity n é fechada. Pode me ajudar nisso? Aqui vai a minha activity onde se introduz os parâmetros, ela é a primeira tela do aplicativo.

public class CreateServerActivity extends Activity {
    //private static final String TAG = SelectServerActivity.class.getSimpleName();
    private  String nome;
    private  String ip;
    private ImageView selecionaIcone;
    int idServidor;


    private int idIcone = R.drawable.iconchanges;

    // Guarda o contexto para a outra thread
    final CreateServerActivity tCont = this;
    // Tenta se conectar ao servidor
    AsyncTask<String, Void, byte[]> buscarResultados;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_server);

        idServidor = getIntent().getIntExtra("idServidor", -1);

        //Funcionalidades do botão
        final ImageView selecionaIcone = (ImageView) findViewById(R.id.imageViewIcon);

        selecionaIcone.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                FragmentManager fm = getFragmentManager();
                dialogfragChangIcon df = new dialogfragChangIcon();
                df.show(fm, "Dialog Fragment");

                df.ivIconsetd = selecionaIcone;

                df.close();



            }

        });
        EditText nome = (EditText) findViewById(R.id.createServerNameInput);
                //.getText().toString();
        EditText ip = (EditText) findViewById(R.id.createServerIp);//.getText().toString();
        Intent intent = this.getIntent();




    }

    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflar o menu; isto acrescenta itens à barra de ação se ela estiver presente.
        getMenuInflater().inflate(R.menu.activity_create_server, menu);
        return true;
    }

    //BOTAO COMFIRMAR
    public void checkInfoAndSave(View v) {

        String nome = ((EditText) findViewById(R.id.createServerNameInput))
                .getText().toString();
        String ip = ((EditText) findViewById(R.id.createServerIp)).getText()
                .toString();




        if (nome.length() == 0 | ip.length() == 0) {
            Toast.makeText(getBaseContext(), "Por favor preencha os campos",
                    Toast.LENGTH_SHORT).show();
            return;
        } else if (idServidor != -1) {
            ServidorDAO sdao = new ServidorDAO(this);
            ServidorModel sm = sdao.find(idServidor);

            sm.setNome(nome);
            sm.setIp(ip);
            sm.setIcone(idIcone);

            sdao.update(sm);
            sdao.cleanup();




        } else {

            // Sucesso, então salva no banco
            ServidorModel newServer = new ServidorModel();
            newServer.setNome(nome);
            newServer.setIp(ip);
            newServer.setIcone(idIcone);

            ServidorDAO sdao = new ServidorDAO(this);
            long id = sdao.create(newServer);

            newServer.setId((int) id);

            sdao.cleanup();

        }

        /*Intent intent = new Intent();
        intent.setClass(CreateServerActivity.this,
                SelectServerActivity.class);

        startActivity(intent);*/



        finish();// Return to the caller
        close();




    }
    protected void close(){
        super.onPause();
    }



    protected void onStop(){
        super.onStop();
    }

    protected void onResume(){
        super.onResume();
    }



    protected void onPause() {
        super.onPause();

        //Log.d(String.valueOf(selecionaIcone), "onPause");


    }






}
Responder
Vinícius Thiengo (1) (0)
20/08/2016
Fernanda, td bem?
Qual é a linha apontada como erro?
Tente rodar sem o close() no método checkInfoAndSave(). Abraço
Responder
22/08/2016
Inicialmente ele estava sem o close() e estava dando este erro/aviso, com o sem o close(), aparece este aviso.
Responder
Vinícius Thiengo (0) (0)
23/08/2016
Fernanda, a linha apontada nos logs como sendo a parte problemática, qual é?
Responder
24/08/2016
O log completo da execução do aplicativo é este.
08-23 14:50:31.067 30708-30708/com.androidcontrol.profilesyanz D/android.widget.GridLayout: horizontal constraints: x1-x0>=284, x2-x1>=332, x2-x0<=576 are inconsistent; permanently removing: x2-x0<=576, x1-x0<=272.
08-23 14:50:31.068 30708-30708/com.androidcontrol.profilesyanz D/android.widget.GridLayout: vertical constraints: y1-y0>=304, y2-y1>=304, y3-y2>=0, y4-y3>=304, y5-y4>=304, y6-y5>=304, y7-y6>=304, y8-y7>=304, y9-y8>=0, y9-y0<=1120 are inconsistent; permanently removing: y9-y0<=1120.
08-23 14:50:42.811 30708-30708/com.androidcontrol.profilesyanz W/IInputConnectionWrapper: showStatusIcon on inactive InputConnection

*Ao iniciar o aplicativo, na primeira tela é pedido para o usuário escolher uma imagem, ao clicar no ícone, abre uma dialogframgment  onde o usuário escolhe a imagem (o grid que o log se refere é a esta escolha de imagens). Após isso o  dialogframgment se fecha, em seguida o há duas editText, onde o usuário deve colocar nome e ip, após isso deve apertar o botão de confirmar. É ai que o aplicativo se fecha e no logo do android studio aparece "W/IInputConnectionWrapper: showStatusIcon on inactive InputConnection". Pode me ajudar?
Responder
Vinícius Thiengo (0) (0)
27/08/2016
Ok, o que resta é ir na "martelada".
Dentro de seu checkInfoAndSave(), antes de cada linha de código coloque um Log.i("log", "número da linha") para ver até onde o código está indo. Se for até a última, realize o mesmo procedimento a partir do onCreate() da Activity SelectServerActivity. Depois volte aqui e mostre o resultado. Abraço
Responder
29/08/2016
Fiz o que você disse, e pude perceber que o aplicativo da "erro" quando executa "finish()". Quando vai fazer este retorno o aplicativo fecha. Tentei substituir por um return e até deixar sem nada. Porém é necessário lá. Qual seria a solução?
Responder
30/08/2016
Eu pesquisei e verifiquei e, realmente como aparece no aviso a atividade n esta sendo encerrada. O finish parece n esta encerrando a classe e indo para outra. Meu objetivo é:  "finalizar e atualizar uma activity tem a activity A que tem o botão adicionar que quando clicado vai para activity B quando adiciono outro dado preciso finalizar a acitivity B e voltar pra activity A com os dados já atualizados."
A activity A é a classe CreatServerActivity e a activity B é a classe SelectServerActivity.
Responder
Vinícius Thiengo (0) (0)
01/09/2016
Tentou sem o close() depois do finish()? Não entendi o close(), pois o conteúdo dele chama o onPause(), sendo que o finish() vai provocar essa chamada tb. Tente assim se não tentou ainda. Abraço
Responder