7
respostas

Salvando o formulario junto com nome do usuario

Estou com a seguinte dúvida:

Eu tenho um formulario de perguntas a ser feito e preciso que este formulario identifique qual usuario esta respondendo-o. Já tenho o login fazendo a validação e carregando o nome do usuario na tela apos o login, porém preciso que esse nome de usuario chegue até a tela do formulario.

Eu faço isso passando o nome através do putextra? Ou eu tenho como identificar isso de uma vez só? Não quero ter que ficar passando esse usuario de tela em tela.

7 respostas

Oi Rafaela, tudo bem ?

Você pode armazenar o usuário num objeto tipo Sessão que temos no mundo web, aqui no android temos a classe Application que tem um papel similar.

O que você precisa fazer é criar uma classe e extender de Application

public class SuaApplication extends Application{

    @Override
    public void onCreate(){

    }

}

Dentro dessa classe você poderia armazenar seu usuário.

public class SuaApplication extends Application{

    private Usuario usuario;

    public void setUsuario(Usuario){
        this.usuario = usuario;
    }

    public Usuario getUsuario(){
        return this.usuario;
    }

}

Agora basta você recuperar o usuario na tela desejada.


public class SuaActivity extends AppCompatActivity{

    public void onCreate(Bundle bundle){

        //restante do código


        SuaApplication application = (SuaApplication) getApplication();

        Usuario usuario = application.getUsuario();

        // basta usar o usuario

    }

}

Para isso tudo funcionar você precisa falar que ao android que você tem uma classe que representa a aplicação, da mesma forma que fazemos com as activities, cadastrando no manifest, lá você verá que você já tem a tag application, basta adicionar o atributo name indicando sua classe.

Mas e se eu quiser pegar o nome do usuario que acabou de fazer o login e jogar dentro de um TextView?

AppComFirebase sessao = (AppComFirebase) getApplication();
        Usuario usuario = sessao.getUsuario();
        txtuser = findViewById(R.id.nome_usuario);
        txtuser.setText(usuario.getNome());

assim ele diz que:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.rafa.appcomfirebase, PID: 30250
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.rafa.appcomfirebase/com.example.rafa.appcomfirebase.TelaPosLoginActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.rafa.appcomfirebase.Model.Usuario.getNome()' on a null object reference
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2572)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654)
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488)
                      at android.os.Handler.dispatchMessage(Handler.java:111)
                      at android.os.Looper.loop(Looper.java:207)
                      at android.app.ActivityThread.main(ActivityThread.java:5728)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.rafa.appcomfirebase.Model.Usuario.getNome()' on a null object reference
                      at com.example.rafa.appcomfirebase.TelaPosLoginActivity.onCreate(TelaPosLoginActivity.java:37)
                      at android.app.Activity.performCreate(Activity.java:6301)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2519)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488) 
                      at android.os.Handler.dispatchMessage(Handler.java:111) 
                      at android.os.Looper.loop(Looper.java:207) 
                      at android.app.ActivityThread.main(ActivityThread.java:5728) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

então como seria o certo?

Em qual momento você setou o usuario ?

Assim que logar você precisa setar ela na sua aplicação

Eu teria que setar ele quando saio da tela de login no caso? Quando eu valido o login?

Porque apos validar o login, eu estava levando o nome do usuario atraves de um putextra, agora eu seto como?

Exatamente, assim que logar você teria que pegar o usuario e setar na aplicação.

A validação é feita neste trecho do código, onde eu setaria?

 private void botaoLogin() {
        botao.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                databaseReference.child("Usuarios").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for(DataSnapshot objetoSnapShot:dataSnapshot.getChildren()){
                            Usuario u = objetoSnapShot.getValue(Usuario.class);
                            usuarios.add(u);

                            if(u.getNome().toString().equals(usuario.getText().toString())&&
                                    u.getSenha().toString().equals(senha.getText().toString())){
                                Intent intent = new Intent(LoginActivity.this, TelaPosLoginActivity.class);

                                intent.putExtra("Usuario", u);
                                startActivity(intent);

                            }else{
                                Toast.makeText(LoginActivity.this, "Verifique login e senha!", Toast.LENGTH_SHORT).show();
                                usuario.requestFocus();
                            }
                        }
                    }
                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }
        });
    }
   Intent intent = new Intent(LoginActivity.this, TelaPosLoginActivity.class);
app.setUsuario(u);
                                startActivity(intent);