Java Android getApplicationContext() возвращает нулевой объект из предыдущего класса

Я пытаюсь передать пользователя из одного класса Java в другой, используя getApplicationContext(). К сожалению, он не работает и возвращает ноль. Я хочу передать информацию о пользователе из LoginActivity в CustomMapActivity. Информация о пользователях хранится в firebase, может ли это быть проблемой?

Я считаю, что манифест в порядке. см. ниже.

  <activity android:name = ".ui.MapCustomActivity"></activity>
     <activity android:name = ".ui.LoginActivity">
         <intent-filter>
             <action android:name = "android.intent.action.MAIN" />

             <category android:name = "android.intent.category.LAUNCHER" />
         </intent-filter>
     </activity>
    <activity android:name = ".ui.RegisterActivity" />
     <activity android:name = ".ui.ProfileActivity" />
    <activity android:name = ".ui.MapCustomActivity"></activity>

Ниже находится LoginActivity,

public class LoginActivity extends AppCompatActivity implements
        View.OnClickListener
      {
       @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        mEmail = findViewById(R.id.email);
        mPassword = findViewById(R.id.password);
        mProgressBar = findViewById(R.id.progressBar);

        setupFirebaseAuth();
        findViewById(R.id.email_sign_in_button).setOnClickListener(this);
        findViewById(R.id.link_register).setOnClickListener(this);

        hideSoftKeyboard();
    }




    private void showDialog(){
        mProgressBar.setVisibility(View.VISIBLE);

    }

    private void hideDialog(){
        if (mProgressBar.getVisibility() == View.VISIBLE){
            mProgressBar.setVisibility(View.INVISIBLE);
        }
    }




      private void setupFirebaseAuth(){
        Log.d(TAG, "setupFirebaseAuth: started.");

        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                //user = null;
                if (user != null) {
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getEmail());
                    Toast.makeText(LoginActivity.this, "Authenticated with: " + user.getEmail(), Toast.LENGTH_SHORT).show();

                    FirebaseFirestore db = FirebaseFirestore.getInstance();
                    FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
                            .setTimestampsInSnapshotsEnabled(true)
                            .build();
                    db.setFirestoreSettings(settings);

                    DocumentReference userRef = db.collection(getString(R.string.collection_users))
                            .document(user.getUid());

                    userRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                            if (task.isSuccessful()){
                                Log.d(TAG, "onComplete: successfully set the user client." + task.getResult());
                                User user = task.getResult().toObject(User.class);
                                ((UserClient)(getApplicationContext())).setUser(user);
                            }
                        }
                    });

                    Intent intent = new Intent(LoginActivity.this, MapCustomActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(intent);
                    finish();

                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }
                // ...
            }
        };
      }

Ниже представлена ​​MapCustomActivity:

public class MapCustomActivity extends AppCompatActivity {

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.activity_map_custom);

        photoview2 = (ImageView) findViewById(R.id.limerickMapImageView);
         mAvatarImage = (ImageView) findViewById(R.id.imageChooseAvatar);

        photoview2.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                ImageView view = (ImageView) v;
                view.bringToFront();
                viewTransformation(view, event);
                return true;
            }
        });
        retrieveProfileImage();

    }
     private void retrieveProfileImage(){
        RequestOptions requestOptions = new RequestOptions()
                .error(R.drawable.cwm_logo)
                .placeholder(R.drawable.cwm_logo);

        int avatar = 0;

        try{

            avatar = Integer.parseInt(((UserClient)getApplicationContext()).getUser().getAvatar());
        }catch (NumberFormatException e){
            Log.e(TAG, "retrieveProfileImage: no avatar image. Setting default. " + e.getMessage() );
        }

        Glide.with(MapCustomActivity.this)
                .setDefaultRequestOptions(requestOptions)
                .load(avatar)
                .into(mAvatarImage);
    }

Ниже приведен класс UserClient.

public class UserClient extends Application {

    private User user = null;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}

Вам нужно передать своего пользователя при запуске своей деятельности, используйте Bundle для дополнительных услуг.

Christopher Vivar Vivar 22.02.2019 01:03

Прости, Кристофер, я не понимаю, что ты имеешь в виду. Не могли бы вы расширить немного больше?

Steve Qsack 22.02.2019 01:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
103
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Чтобы передать данные из одного действия в другое с помощью намерения, убедитесь, что вы выполнили следующие шаги.

  • Шаг 1. Создайте новый явный или неявный объект Intent в исходном коде. Мероприятия.
  • Шаг 2. Вызовите метод намерение.putExtra (строковый ключ, данные объекта), чтобы сохранить в нем данные.
  • Шаг 3. Вызовите метод startActivity(intent) в исходной активности, чтобы передать намерение ОС Android.
  • Шаг 4. Вызовите метод getIntent() в целевой активности.

В вашем случае я думаю, что вы пропустили Шаг 2

Вы используете getApplicationContext, но, возможно, вы пытались использовать метод получитьприложение из Activity. Я не рекомендую использовать этот подход для передачи объектов из одного действия в другое. Вы должны использовать объект Intent. Взгляните на официальные документы

Можете ли вы использовать bundle, чтобы предоставить информацию между действиями?

Bundle bundle = new Bundle();
bundle.putInt("value_name", 0);// 0 = value
bundle.putString("value_name", "text"); // Text = value string

Intent intent = new Intent(this, SecondActivty.class);
intent.putExtras(bundle);
startActivity(intent);

и поймать во втором действии

public class SecondActivty extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_activty);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    int value = savedInstanceState.getInt("value_name");
}

В вашей текущей деятельности создайте новое намерение:

String value = "Hello world";
Intent i = new Intent(CurrentActivity.this, NewActivity.class);    
i.putExtra("key",value);
startActivity(i);

Затем в новом действии извлеките эти значения:

Bundle extras = getIntent().getExtras();
if (extras != null) {
    String value = extras.getString("key");
    //The key argument here must match that used in the other activity
}

С помощью этой техники вы сможете передавать переменные в действии

И избегайте использования getApplicationContext, поскольку иногда он может возвращать значение null, как в вашем случае.

Subhasmith Thapa 22.02.2019 04:07

Другие вопросы по теме