我需要帮助让我的MainActivity重新加载以反映用户何时登录。
我的主要活动是这样的:
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) {
}
}
我的登录活动(或更准确的部分):
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");
}
所以问题是当我回到我的MainActivity时它没有更新,因此它没有看到它现在已经登录。
我需要我的MainActivity来显示我已登录,以便它会根据权限显示相应的选项,并隐藏登录选项,因为它已经登录。
编辑: 这是我的会话管理类
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;}
}
答案 0 :(得分:2)
因此,您必须创建一个Singleton类或将Session类创建为Parcelable,以便能够在一个包中传递它。
您只需将会话保留在内存中即可。清除应用程序后,会话也将从内存中清除。
public class Session {
public boolean isLoggedIn;
}
public class SessionInjector {
private static Session session;
public static Session getSession() {
if (session == null) {
session = new Session();
}
return session;
}
}
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!");
}
}
}
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();
}
}
开始结果活动。这是这种场合的完美示例,而不是完成活动,然后重新启动相同的活动。您只需对所做的更改做出反应。
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!");
}
}
}
}
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();
}
}
答案 1 :(得分:1)
当Activity完成时,session
作为参考被销毁,因此该对象中的所有数据都将丢失,
新活动将创建一个新的session
,它将为空(默认值)
您需要做的是使用单身人士或使用public static
中的SessionManagement
变量并直接访问它们。
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; ...
并在您的登录活动中:
if (conPassword.equals(secPassword)) {
SessionManagement.LoggedIn = true;
SessionManagement.perms =perms; ....
同样在MainActivity中直接访问变量以检查它们,
if (SessionManagement.perms.equals("mod") ...
如果你想让你的变量保密,你仍然可以使用private static
表示变量,public static
表示setter / getters,这样它也会起作用,你会保持你的变量私有
你可以像这样使用:
SessionManagement.setPerms(...);