0

Опишу ситуацию: при нажатии на 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);
}
Semior
  • 169
  • 1
    приведите, пожалуйста, пример кода – Ksenia Sep 09 '16 at 17:02
  • 4
    NullPointerException значит что Вы обратились к пустой переменной как к обьекту. Дайте пример кода и получите ответ! – Андрей Шпилевой Sep 09 '16 at 17:10
  • Знаю я, кто такие NullPointerException. Кусок кода не вставил, ибо думал что предположение об решении проблемы можно сформулировать без куска кода. – Semior Sep 09 '16 at 17:38
  • 1
    было бы неплохо если бы еще сказали в какой строке падает! – Kirill Stoianov Sep 09 '16 at 17:39
  • Строку не укажу, ибо код уже переписал, но падает при обращении к MenuItem с setTitle в LoginActivity – Semior Sep 09 '16 at 17:43
  • @Semior Запустите дебаггер и пройдите в тот класс где падает ошибка и все сразу станет ясно, в андройд студио это делается на раз два, чем больше информации о проблеме, тем эта проблема меньше)) – Grigory Zaripov Sep 11 '16 at 08:10

0 Answers0