Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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/