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

TextInputLayout com método

Olá, pessoal.

No meu formulário, utilizo o TextInputLayout como um spinner (para manter o padrão dos campos), conforme código abaixo (coloquei o id como spinner para facilitar a identificação)

<com.google.android.material.textfield.TextInputLayout
                        android:id="@+id/situacao_TextInputLayout"
                        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="8dp"
                        android:textColorHint="#1B508C"
                        android:textSize="18sp"
                        app:boxBackgroundColor="#FFFFFF"
                        app:boxStrokeColor="#1B508C"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintHorizontal_bias="0.0"
                        app:layout_constraintStart_toStartOf="@+id/dados_gerais"
                        app:layout_constraintTop_toBottomOf="@+id/comoNosConheceu_TextInputLayout" >

                        <AutoCompleteTextView
                            android:id="@+id/spinner_Situacao"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:editable="false"
                            android:hint="Situação" />
                    </com.google.android.material.textfield.TextInputLayout>

                    <com.google.android.material.textfield.TextInputLayout
                        android:id="@+id/data_limite_situacao"
                        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="8dp"
                        android:textColorHint="#1B508C"
                        android:textSize="18sp"
                        android:visibility="gone"
                        app:boxBackgroundColor="#FFFFFF"
                        app:boxStrokeColor="#1B508C"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintHorizontal_bias="0.0"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toBottomOf="@+id/situacao_TextInputLayout">

                        <com.google.android.material.textfield.TextInputEditText
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:hint="Data limite"
                            android:inputType="date" />
                    </com.google.android.material.textfield.TextInputLayout>

Porém, preciso de uma validação no primeiro TextInputLayout: dependendo das opções que o usuário selecionar, irei setar o segundo para torná-lo visível (está como android:visibility="gone").

Fiquei na dúvida de qual método usar e tentei de duas formas (com setOnClickListener e outra com setOnItemSelectedListener), conforme abaixo, mas não consegui.

Poderiam me auxiliar, por favor?

situacao_TextInputLayout = findViewById(R.id.situacao_TextInputLayout);
        situacao_TextInputLayout.setOnClickListener(v -> {
            String situaSelecionada2 = spinnerSituacao.getEditableText().toString();
            if(situaSelecionada2.equals("Matriculado")) {
                campo_data_situacao_limite =  findViewById(R.id.data_limite_situacao);
                campo_data_situacao_limite.setVisibility(v.VISIBLE);
            }
        });

        spinnerSituacao.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
           public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String situacao_selecionada = spinnerSituacao.getEditableText().toString();
                if(situacao_selecionada.equals("Matriculado")) {
                    campo_data_situacao_limite =  findViewById(R.id.data_limite_situacao);
                    campo_data_situacao_limite.setVisibility(view.VISIBLE);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
18 respostas

Thiago, tudo bem ?

Acredito que apenas colocar no onItemSelected já resolva isso, referente ao clique acho que não seja necessário.

Além disso

public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String situacao_selecionada = (String) spinnerSituacao.getItemAtPosition(position);
                if(situacao_selecionada.equals("Matriculado")) {
                    campo_data_situacao_limite =  findViewById(R.id.data_limite_situacao);
                    campo_data_situacao_limite.setVisibility(view.VISIBLE);
            }

Deve resolver seu problema também.

Oi, Matheus.

Para mim, apareceu "Cannot resolve method 'getItemAtPosition' in 'AutoCompleteTextView'".

Aí, pelo seu código, trocando

String situacao_selecionada = (String) spinnerSituacao.getItemAtPosition(position);

Para

String situacao_selecionada = (String) parent.getItemAtPosition(position);

Rodou, mas o campo oculto não apareceu.

Consegue ver qual é o valor ?

Acredito que um simples Log.i("chave", situacao_selecionada) resolva.

Desisto de tentar kkk. Tentei localizar a mensagem no logcast de todos os meios e não consegui

Você consegue colocar um filtro na busca no logcat.

No android studio tem a aba logcat, quando tu abrir vai mostrar todos os logs do emulador.

Nessa aba, na parte de cima, você vai ver que tem opção de escolher emulador, aplicativo, e algumas opções, dentro delas vai ter uma lupa e o campo de busca, ali basta você digitar o nome da chave que você colocou para a classe Log printar ali.

Pois é. Fiz isso e não apareceu nenhum registro

Quase quebrei o notebook de raiva kkk

Calma, isso as vezes acontece mesmo :(

Reinicia o android studio e também o emulador, as vezes o adb se perde e não loga nada, geralmente é quando a gente precisa dele kkk

Rsrs. Veja se está tudo certo, por favor https://imgur.com/GDjMoJ0

Thiago, pensando aqui

Pode ser que não esteja aparecendo pelo fato de ser um valor nulo.

Consegue validar pra gente se não é nulo?

Log.i("chave", "valor: "+situacao_selecionada);

Concatenando ele deve exibir valor: null

Nada https://imgur.com/a/vxDy5uq. Ele é teimoso rsrs

solução!

To um pouco na dúvida aqui, o que você acha de trocar o seu listener ? só pra gente validar algo ?

Usar OnItemClickListener invés OnItemSelectedListener, você vai ter trocar o setter também, mas estou na dúvida ainda se só isso vai rolar.

Fui ver na documentação qual é o melhor caso de uso e eles sugerem o OnItemClickListener, por isso minha sugestão.

Rapaz, agora deu... tive que fazer uma mudança antes do if, mas rodou

Mas fui colocar um else (selecionando qualquer outra opção, o campo deve voltar para visibilidade GONE) e dá NPE https://imgur.com/undefined

spinnerSituacao.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String situacao_selecionada = spinnerSituacao.getEditableText().toString();
                Log.i("chave", "valor: " + situacao_selecionada);
                if (situacao_selecionada.equals("Matriculado")) {
                    campo_data_situacao_limite = findViewById(R.id.data_limite_situacao);
                    campo_data_situacao_limite.setVisibility(view.VISIBLE);
                } else
                    campo_data_situacao_limite.setVisibility(view.GONE);
            }
        });

Se seleciono matriculado primeiro e depois outra opção, dá certo, pois, no caso, já tem um valor no campo e não é mais null. Como posso tratar isso?

Fiz uns testes colocando outros ifs se fosse null para retornar nada... mas não deu rsrs

Um detalhe importante, faça todos os seus findViewById como primeira coisa no seu código, não dentro de listener, nesse caso você atribui valor apenas se tiver matriculado e outras situações ele sempre estará nulo.

Não tinha me tocado. Passei para o método que inicializa os campos e funcionou normalmente. Muitíssimo obrigado novamente.

hehehe

O que precisar estamos por aqui, desculpa a demora pela ajuda, fomos descobrindo juntos o problema rs

Que isso. Sem problemas. Agradeço d+