简体   繁体   中英

Reload MainActivity after navigating with Intent

I need assistance getting my MainActivity to reload to reflect when a user logs in.

My MainActivity is as such:

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        if (session.getPerms().equals("mod") || session.getPerms().equals("dev") || session.getPerms().equals("admin")){
            Menu nav_Menu = navigationView.getMenu();
            nav_Menu.findItem(R.id.nav_queue).setVisible(true);
        }else{
            Menu nav_Menu = navigationView.getMenu();
            nav_Menu.findItem(R.id.nav_queue).setVisible(false);
        }

        if(session.getLogInState()){
            Menu nav_Menu = navigationView.getMenu();
            nav_Menu.findItem(R.id.nav_login).setVisible(false);
        }
    }
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_login) {
            Intent login = new Intent(MainActivity.this, Login.class);
            finish();
            startActivity(login);

        } else if (id == R.id.nav_queue) {
            startActivity(new Intent(MainActivity.this, ModQueue.class));

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }
}

My Login Activity (or the part that matters more accurately):

if (conPassword.equals(secPassword)) {
                session.setLogInState(true);
                session.setEmail(conEmail); ;
                session.setPerms(perms);
                session.setFirst(first);
                session.setLast(last);
                rs.close(); //if a ResultSet was returned
                stmt.close(); //Close Statement
                con.close();
                System.out.println("Logged in");
                System.out.println(session.getPerms());
                Intent main = new Intent(Login.this, MainActivity.class);
                finish();
                startActivity(main);
            } else {
                System.out.println("Unable to Login");
            }

So the issue is when i go back to my MainActivity it has not updated and so it does not see that it is now logged in.

I need my MainActivity to show that i ma logged in so that it will show the appropriate options based on Permissions as well as hide the login option as it is already logged in.

edit: Here is my Session Management class

    public class SessionManagement {
    private boolean LoggedIn = false;
    private String perms = "Guest";
    private String email;
    private String first;
    private String last;


    public boolean getLogInState(){ return LoggedIn; }

    public void setLogInState(Boolean Logged){ LoggedIn = Logged; }

    public String getPerms(){ return perms; }

    public void setPerms(String newPerms){ perms = newPerms; }

    public String getEmail(){ return email;}

    public void setEmail(String newEmail){ email = newEmail; }

    public String getFirst(){ return first;}

    public void setFirst(String newFirst){ first = newFirst; }

    public String getLast (){ return last;}

    public void setLast (String newLast){ last = newLast;}

}

So you have to create a Singleton class or create Session class as Parcelable to be able to pass it in a bundle.

Singleton

You just keep the session in the memory. When the app is cleared, session also will be cleared out from memory.

Session

public class Session {
    public boolean isLoggedIn;
}

SessionInjector

public class SessionInjector {

private static Session session;

public static Session getSession() {
    if (session == null) {
        session = new Session();
    }
    return session;
}
}

First Approach

MainActivity

public class MainActivity extends AppCompatActivity {

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

    if (!SessionInjector.getSession().isLoggedIn) {
        startActivity(new Intent(this, LoginActivity.class));
        finish();
    } else {
        ((TextView) findViewById(R.id.text)).setText("Logged In!");
    }
}

}

LoginActivity

public class LoginActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    SessionInjector.getSession().isLoggedIn = true;

    startActivity(new Intent(this, MainActivity.class));
    finish();
}

}

Second Approach

Start activity for result. This is perfect example for such occasions instead of finishing the activities and then restarting the same one. You just need to react to changes made.

MainActivity

public class MainActivity extends AppCompatActivity {

private final static int LOGIN_REQUEST_CODE = 44;

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

    if (!SessionInjector.getSession().isLoggedIn) {
        startActivityForResult(new Intent(this, LoginActivity.class), LOGIN_REQUEST_CODE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == LOGIN_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            ((TextView) findViewById(R.id.text)).setText("Logged In!");
        }
    }
}

}

LoginActivity

public class LoginActivity extends AppCompatActivity {

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

    SessionInjector.getSession().isLoggedIn = true;

    setResult(RESULT_OK);
    finish();
}

}

when Activity is finished , session as a reference is destroyed, so all data in that object will be lost, the new activity will create a new session which will be empty (default values)

what you need to do is use a singleton or use a public static variables in SessionManagement and access them directly.

public class SessionManagement {
    public static boolean LoggedIn = false;
    public static String perms = "Guest";
    public static String email;
    public static String first;
    public static String last; ...

and in your Login activity:

if (conPassword.equals(secPassword)) {
   SessionManagement.LoggedIn = true;
   SessionManagement.perms =perms; ....

Also in MainActivity access the variables directly to check them,

if (SessionManagement.perms.equals("mod") ...

if you want to keep your variables private you can still use private static for variables and public static for the setters/getters this way it will work too, and you will keep your variables private

you can use like this:

SessionManagement.setPerms(...);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM