Опишу ситуацию: при нажатии на MenuItem открывается activity с формой логина. При успешном логировании activity должно закрыться, а надпись на MenuItem поменяться. При попытке использовать MenuItem вне onPrepareOptionsMenu материнского activity вылетает NullPointerException. Как решить данную проблему?
Кусок кода из Login activity (onclick кнопки login):
Backendless.UserService.login( email, password, new AsyncCallback<BackendlessUser>()
{
public void handleResponse( BackendlessUser user )
{
Toast.makeText(mLoginFormView.getContext(), "Successfuly logged in", Toast.LENGTH_SHORT).show();
showProgress(false);
System.out.println("Successfuly logged in");
MainActivity.loggedIn = true;
MainActivity.loginLogoutBtn.setTitle("Logout");
finish();
}
public void handleFault( BackendlessFault fault )
{
String errorCode = fault.getCode();
try {
int id = mLoginFormView.getContext().getResources().getIdentifier("backendless" + errorCode, "string", mLoginFormView.getContext().getPackageName());
String error = mLoginFormView.getContext().getString(id);
Toast.makeText(mLoginFormView.getContext(), error, Toast.LENGTH_SHORT).show();
} catch (Exception e){
System.out.println(e.toString());
Toast.makeText(mLoginFormView.getContext(), errorCode, Toast.LENGTH_SHORT).show();
}
showProgress(false);
}
});
Кусок кода из Main activity:
public static MenuItem loginLogoutBtn;
public static boolean loggedIn;
@Override
protected void onCreate(Bundle savedInstanceState) {
Backendless.initApp(this, BackendlessManager.getBackendless_app_id(), BackendlessManager.getBackendless_app_key(), BackendlessManager.getBackendless_app_version());
user = Backendless.UserService.CurrentUser();
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean b = super.onPrepareOptionsMenu(menu);
loginLogoutBtn = menu.findItem(R.id.loginLogoutItem);
if(user!=null){
loginLogoutBtn.setTitle("Logout");
}else{
loginLogoutBtn.setTitle("Login");
}
return b;
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
int id = item.getItemId();
if (id == R.id.loginLogoutItem) {
if(loggedIn){
Backendless.UserService.logout(new AsyncCallback<Void>() {
@Override
public void handleResponse(Void response) {
Toast.makeText(getApplicationContext(), "Successfully logout", Toast.LENGTH_SHORT).show();
loggedIn = false;
item.setTitle("Login");
}
@Override
public void handleFault(BackendlessFault fault) {
Toast.makeText(getApplicationContext(), "Failed logout", Toast.LENGTH_SHORT).show();
}
});
return true;
}else{
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
}
}
return super.onOptionsItemSelected(item);
}