Java Android getApplicationContext() 从上一个类返回一个 null 对象

标签 java android

我正在尝试使用 getApplicationContext() 将用户从一个 java 类传递到另一个类。不幸的是它不起作用并且返回 null。我希望将用户信息从 LoginActivity 传递到 CustomMapActivity。用户信息存储在 firebase 中,这可能是一个问题吗?

我相信 list 是正确的。请参阅下文。

  <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>

下面是登录 Activity ,

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;
    }

}

最佳答案

要使用 Intent 将数据从一个 Activity 传递到其他 Activity ,请确保您执行了以下步骤。

  • 第 1 步在源中创建新的显式或隐式 Intent 对象 Activity 。
  • 第2步调用intent.putExtra(String key, Object data)方法将数据保存到其中。
  • 第 3 步在源 Activity 中调用 startActivity(intent) 方法,将 Intent 传递给 Android 操作系统。
  • 步骤 4 在目标 Activity 中调用 getIntent() 方法。

在你的情况下,我认为你错过了第2步

关于Java Android getApplicationContext() 从上一个类返回一个 null 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54818075/

相关文章:

java - 在 Java 中创建时间戳的正确方法是什么?

java - Java/pdf文本渲染

android - XMPP 和安卓

java - Wildfly -9 javax.mail 不工作

java - Spring Autowiring

java - 将值从 JSP 发送到 servlet

Android 9-patch 批处理

java - Android Activity 之间传递 protobuf

android - 为 ListView 设置 setOnKeyListener

java - 表现形式畸形?