Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Spinner como usar ? onNothingSelected

Olá bom dia no Android estou utilizando um componente chamado Spinner para que o usuário escolha um tipo de Usuário{Gerente, Dono, Desenvolvedor, Cliente), em um cadastro de usuário. No entanto tá acontecendo dois problemas o primeiro e que sempre o Gerente por ser o primeiro item é cadastrado mesmo que nenhuma seleção seja feita, eu tentei colocar um "Selecione um Item" para ajudar acontece que ele acaba sendo cadastrado também e quando tento alterar gostaria que o tipo atual viesse já selecionado no spinner isso é possível ? Já li muita gente no StackOverflow querendo fazer isso e ninguém consegue. Qual seria uma solução pra que eu não ficasse cadastrando ou alterando sempre pra posiiton 0 ? Eu vi que tem um método onNothingSelected, mas ele não faz nada coloquei um TOAST nele e ele não dá sinal de vida. Desde já agradeço.

Meu layout reduzido

<?xml version="1.0" encoding="utf-8"?>


    <Spinner
        android:layout_height="match_parent"
        android:id="@+id/spnnr_seletor_tipo_usuario"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_centerHorizontal="false"
        android:spinnerMode="dialog" />

    <Button
        android:text="Alterar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/bttn_alterar_usuario"
        style="@style/Widget.AppCompat.Button.Colored"
        android:layout_gravity="bottom"
        android:visibility="invisible"
        android:textAlignment="center"
        android:background="@color/colorPrimaryDark"
        android:layout_marginTop="10dp"
        android:textSize="18sp" />

    <Button
        android:text="Cadastrar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/bttn_cadastrar_usuario"
        android:layout_gravity="bottom"
        android:layout_marginBottom="15dp"
        style="@style/Widget.AppCompat.Button.Colored"
        android:elevation="1dp"
        android:textAlignment="center"
        android:visibility="visible"
        android:textSize="18sp" />


</LinearLayout>
</ScrollView>

Minha Classe reduzida

public class Formulario_Cadastro_Usuario extends AppCompatActivity{

    Spinner spinner;
    Usuarios usuario;
    private UsuarioHelper helper;
    private DBHelper dbhelper;
    private String caminhoFoto;
    private String tipo_selecionado;
    public static final int CODIGO_CAMERA = 12;
    public static final int SELECT_PICTURE = 1234;
    private FloatingActionButton botao_adicionar_foto;
    private Button botao_Alterar_Cadastro;
    private Button botao_Cadastrar_Usuario;
    private FloatingActionButton botao_flutuante_escolher_galeria;
    private FloatingActionButton botao_flutuante_tirar_foto;

    private String selecionado;
    private int ultima_posicao;


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


        dbhelper = new DBHelper(this);
        helper = new UsuarioHelper(this, this);
        Intent intent = getIntent();
        usuario = (Usuarios) intent.getSerializableExtra("usuario");

        botao_flutuante_tirar_foto = (FloatingActionButton) findViewById(R.id.fltng_actn_bttn_tirar_foto);
        botao_flutuante_escolher_galeria = (FloatingActionButton) findViewById(R.id.fltng_actn_btton_galeria);
        botao_Alterar_Cadastro = (Button) findViewById(R.id.bttn_alterar_usuario);
        botao_Cadastrar_Usuario = (Button) findViewById(R.id.bttn_cadastrar_usuario);
        spinner = (Spinner) findViewById(R.id.spnnr_seletor_tipo_usuario);


        if (usuario != null) {
            usuario = helper.preencheFormulario(usuario);
            botao_Alterar_Cadastro.setVisibility(View.VISIBLE);
            botao_Cadastrar_Usuario.setVisibility(View.INVISIBLE);
            botao_Alterar_Cadastro.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    UsuarioDAO dao = new UsuarioDAO(dbhelper);
                    usuario = helper.pegaUsuario();
                    usuario.setTipo_de_usuario(selecionado);
                    dao.altera(usuario);
                    dbhelper.close();
                    Toast.makeText(Formulario_Cadastro_Usuario.this, usuario.getTipo_de_usuario() + " " + usuario.getNome() + " Alterado com sucesso", Toast.LENGTH_SHORT).show();
                    Intent vai_pros_Cadastradados = new Intent(Formulario_Cadastro_Usuario.this, Cadastros.class);
                    startActivity(vai_pros_Cadastradados);
                }
            });
        }


        botao_flutuante_tirar_foto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent vai_pra_camera = new Intent(ACTION_IMAGE_CAPTURE);
                caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg";
                File arquivo_foto = new File(caminhoFoto);
                Uri photoURI = FileProvider.getUriForFile(Formulario_Cadastro_Usuario.this,
                        BuildConfig.APPLICATION_ID + ".provider",
                        arquivo_foto);
                vai_pra_camera.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(vai_pra_camera, CODIGO_CAMERA);

            }
        });


        botao_flutuante_escolher_galeria.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent vai_para_galeria = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(vai_para_galeria, SELECT_PICTURE);

            }
        });


        final ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                R.array.xml_tipos_usuarios, android.R.layout.simple_spinner_item);
        spinner.setPrompt("Escolha um tipo");
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                ultima_posicao = position;
                long id_da_posicao = id;

                switch (position) {
                    case 0:
                        selecionado = parent.getItemAtPosition(1).toString();
                        ultima_posicao=0;
                        break;
                    default:
                        selecionado = parent.getItemAtPosition(position).toString();
                        ultima_posicao=position;
                        break;
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                if(selecionado==usuario.getTipo_de_usuario()){
                    Toast.makeText(Formulario_Cadastro_Usuario.this,"Nenhum selecionado",Toast.LENGTH_LONG).show();
                }

            }
        });

        botao_Cadastrar_Usuario.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                UsuarioDAO dao = new UsuarioDAO(dbhelper);
                UsuarioHelper helper = new UsuarioHelper(Formulario_Cadastro_Usuario.this, Formulario_Cadastro_Usuario.this);
                Usuarios usuario = helper.pegaUsuario();
                usuario.setTipo_de_usuario(selecionado);
                dao.insere(usuario);
                Toast.makeText(Formulario_Cadastro_Usuario.this, usuario.getTipo_de_usuario() + " " + usuario.getNome() + " cadastrado com sucesso", Toast.LENGTH_LONG).show();
                Intent vaipraUsuariosCadastrados = new Intent(Formulario_Cadastro_Usuario.this, Cadastros.class);
                startActivity(vaipraUsuariosCadastrados);
            }
        });
    }
}
1 resposta
solução!

Olá Maison,

Realmente o método onNothingSelected tem um comportamento meio estranho. Ele deveria ser chamado somente quando alguma ação externa causa o fechamento da lista de seleção sem que o usuário tenha escolhido algum item. Diferente do que imaginamos, que ele vai ser chamado quando não escolhemos nenhum dos itens "válidos".

Não existe uma solução prática para esse problema, o que costuma-se fazer é manter mesmo um item vazio a mais mesmo no Spinner e se o usuário selecionar esse item fazemos um tratamento a parte para não persistir o dado associado ao Spinner.

Para repopular o Spinner, você pode ler os dados do banco e chamar o método spinner.setSelection(indice) onde indice tem que ser a posição do item que você leu do banco.