Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Coletar dados de um Combobox (Spinner)

Pessoal, bom dia

Estou com uma duvida, estou incrementando o código que esta sendo apresentado no curso, tenho um campo chamado E-mail (comboBox) e gostaria de recuperar ele. No momento estou fazendo da seguinte forma (abaixo)

campoTipoEmail.setSelection(campoTipoEmail.getSelectedItemPosition());

Mas so esta vindo o primeiro item da minha lista (0). Mesmo se eu estiver selecionado outro item.

O procedimento esta correto?

10 respostas

Olá Julio!

Não consegui entender a sua dúvida somente pelo código que você postou. No trecho que você mostrou você está simplesmente setando o item selecionado (setSelection(...)) com o próprio item selecionado (getSelectedItemPosition(...)).

Para recuperar o item selecionado você pode fazer algo como:

campoTipoEmail.getItemAtPosition(campoTipoEmail.getSelectedItemPosition());

Faça um teste e veja se resolve seu problema!

Ola Jeferson,

Nao funcionou este procedimento =/, peço desculpas tenho o habilito de nao me expressar da forma correta.

Na ocasião estou tentando recuperar os dados da função.

Por exemplo, no momento que eu for editar quero que o spinner me retorne o tipo de e-mail que esta registrado para X aluno.


public void preencheFormulario(Aluno aluno) {
        campoNome.setText(aluno.getNome());
        campoEndereco.setText(aluno.getEndereco());
        campoTelefone.setText(aluno.getTelefone());
        campoSite.setText(aluno.getSite());
        campoNota.setProgress(aluno.getNota().intValue());
        campoTipoEmail.setSelection(campoTipoEmail.getSelectedItemPosition());
        this.aluno = aluno;
    }

    }

Opa Julio,

Então, uma forma de você fazer isso é salvando previamente o tipo de e-mail do aluno para depois recupera-lo.

Por exemplo:

public void preencheFormulario(Aluno aluno) {
            // os outros códigos

            campoTipoEmail.setSelection(aluno.getTipoEmail());
            this.aluno = aluno;
    }

Da forma que você ta fazendo, apenas está re-selecionando o primeiro item:

campoTipoEmail.setSelection(campoTipoEmail.getSelectedItemPosition());  //repara que você insere como parâmetro para seleção da posição o mesmo item que você ta setando?

campoTipoEmail.getSelectedItemPosition()

Se modificar o parâmetro para o do objeto aluno, o problema deve ser resolvido.

Espero que ajude e boa sorte.

Jeferson,

Da forma que voce informou, nao é possivel.

Pois o que é capturado no setSelections é um int, e dentro da referencia, estamos passando uma String. Mesmo fazendo o cast é estourado uma excessao NullPointerException.

Da forma que fiz foi a unica maneira que encontrei de passar a referencia da posicao por um int.

Olá Julio,

Para setar um campo selecionado de um Spinner utilizando a String e não um int você pode utilizar o método getPosition(...) do Adapter do Spinner da seguinte forma:

ArrayAdapter<String> adapter = (ArrayAdapter<String>) campoTipoEmail.getAdapter();
int posicaoNoAdapter = adapter.getPosition(aluno.getTipoEmail());
campoTipoEmail.setSelection(posicaoNoAdapter);

Olá Jeferson, desculpa a demora para responder, o procedimento que voce passou infelizmente nao deu certo, ele gerou a seguinte exception

 FATAL EXCEPTION: main
    Process: br.com.alura.agenda, PID: 2788
    java.lang.RuntimeException: Unable to start activity ComponentInfo

    {br.com.alura.agenda/br.com.alura.agenda.FormularioActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.ArrayAdapter.getPosition(java.lang.Object)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.ArrayAdapter.getPosition(java.lang.Object)' on a null object reference
    at br.com.alura.agenda.FormularioHelper$override.preencheFormulario(FormularioHelper.java:49)
    at br.com.alura.agenda.FormularioHelper$override.access$dispatch(FormularioHelper.java)
    at br.com.alura.agenda.FormularioHelper.preencheFormulario(FormularioHelper.java:0)
    at br.com.alura.agenda.FormularioActivity.onCreate(FormularioActivity.java:45)
    at android.app.Activity.performCreate(Activity.java:6237)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
            11-10 02:30:41.218 1547-2140/system_process W/ActivityManager:   Force finishing activity br.com.alura.agenda/.FormularioActivity
    11-10 02:30:41.235 1547-2140/system_process W/ActivityManager:   Force finishing activity br.com.alura.agenda/.ListaAlunosActivity
    11-10 02:30:41.264 1220-1593/? E/SurfaceFlinger: ro.sf.lcd_density must be defined as a build property
    11-10 02:30:41.267 1547-4994/system_process D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true

Olá Julio,

Como você está fazendo para inserir os dados no seu Spinner? Geralmente criamos um adapter para associar os dados com o Spinner.

De acordo com o erro, seu Spinner não possui nenhum adapter associado a ele. Se ele não possui nenhum adapter, não conseguimos selecionar nenhum item pois não existem dados associados a ele.

Jeferson, boa tarde!

Estou utilizando um adapter para fazer este procedimento, segue abaixo o codigo dele.

Estes dados estao sendo usados no FormularioActivity,java

Dentro do evento onCreate....


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

        helper = new FormularioHelper(this);

        Intent intentAlunoSerializado = getIntent();
        Aluno aluno = (Aluno) intentAlunoSerializado.getSerializableExtra("aluno");
        if (aluno != null) {
            helper.preencheFormulario(aluno);
        }


        List<String> filmes = Arrays.asList("Gmail", "Hotmail", "Bol", "Outros");
        ArrayAdapter<String> adapterSpinner;
        Spinner spinerEmail;
        adapterSpinner = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, filmes);
        spinerEmail = (Spinner) findViewById(R.id.formulario_campoEmail);
        spinerEmail.setAdapter(adapterSpinner);


        Button botaoFoto = (Button) findViewById(R.id.formulario_novaFoto);
        botaoFoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg";
                File arquivoFoto = new File(caminhoFoto);
                intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto));
                startActivityForResult(intentCamera, CODIGO_CAMERA);
            }
        });
    }
solução!

Olá Julio,

Vamos analisar o seguinte trecho de código:

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

        helper = new FormularioHelper(this);

        Intent intentAlunoSerializado = getIntent();
        Aluno aluno = (Aluno) intentAlunoSerializado.getSerializableExtra("aluno");
        if (aluno != null) {
            helper.preencheFormulario(aluno);
        }


        List<String> filmes = Arrays.asList("Gmail", "Hotmail", "Bol", "Outros");
        ArrayAdapter<String> adapterSpinner;
        Spinner spinerEmail;
        adapterSpinner = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, filmes);
        spinerEmail = (Spinner) findViewById(R.id.formulario_campoEmail);
        spinerEmail.setAdapter(adapterSpinner);

        // resto do código

Perceba que nesse código, o método preencheFormulario(...) é chamado antes de definirmos quem é o Adapter do Spinner. Isso significa que quando tentarmos pegar o Adapter naquele código que te passei, receberemos um null como resposta, explicando assim a NullPointerException que estamos tomando.

Para resolver, uma simples mudança de ordem deve funcionar:

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

        helper = new FormularioHelper(this);

        List<String> filmes = Arrays.asList("Gmail", "Hotmail", "Bol", "Outros");
        ArrayAdapter<String> adapterSpinner;
        Spinner spinerEmail;
        adapterSpinner = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, filmes);
        spinerEmail = (Spinner) findViewById(R.id.formulario_campoEmail);
        spinerEmail.setAdapter(adapterSpinner);

        Intent intentAlunoSerializado = getIntent();
        Aluno aluno = (Aluno) intentAlunoSerializado.getSerializableExtra("aluno");
        if (aluno != null) {
            helper.preencheFormulario(aluno);
        }

        // resto do código

Nesse caso, estamos preparando o Adapter primeiro e depois pedindo para preencher o formulário. Agora sim o código de seleção do Spinner deve funcionar.

Jeferson, muito obrigado, realmente foi necessario fazer as 2 alteracoes conforme recomendado por voce.

Me ajudou bastante \o/