为什么我的 .putExtra 没有传递信息?

Why is my .putExtra not passing information?

我正在创建一个类似于笔记应用程序的应用程序。我有一个名为 AddEditUserActivity 的 activity,顾名思义,它添加或编辑了一个 user(我创建的 object)。当我在 RecyclerView 上单击 user 时,我应该转到 AddEditUserActivity 并查看 5 个字段,其中包含所选 user 的信息以及 activity 作为“编辑用户”。当我创建一个新用户时,我应该转到相同的 activity,但字段为空,标题为“添加用户”。创建用户工作正常,但是当我尝试对其进行编辑时,activity 以“添加用户”作为标题出现,并且所有字段都是空的。

奇怪的是,我实现了一些 Toast 消息,例如“用户更新”和“用户创建”,它们会在应该显示的时候显示。我认为问题出在 MainActivity。当我点击一个用户时,我 putExtra 到一个 Intent 然后调用 startActivityForResult(EDIT_USER_REQUEST, intent)。在 AddEditUserActivity 中,在 onCreate 中,我指定如果意图有一个特定的额外(id)那么这意味着我正在更新用户。但它忽略了那部分。如果您能帮助我,我将不胜感激。

这是我的 MainActivity:

package com.example.citadelentrance;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    public static final int ADD_USER_REQUEST = 1;
    public static final int EDIT_USER_REQUEST = 2;

    private UserViewModel userViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FloatingActionButton addUserButton = findViewById(R.id.button_add_user);
        addUserButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, AddEditUserActivity.class);
                startActivityForResult(intent, ADD_USER_REQUEST);
            }
        });

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);

        final UserAdapter adapter = new UserAdapter();
        recyclerView.setAdapter(adapter);

        userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
        userViewModel.getAllUsers().observe(this, new Observer<List<User>>() {
            @Override
            public void onChanged(@Nullable List<User> users) {
                adapter.submitList(users);
            }
        });

        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                userViewModel.delete(adapter.getUserAt(viewHolder.getAdapterPosition()));
                Toast.makeText(MainActivity.this, "User deleted", Toast.LENGTH_SHORT).show();
            }
        }).attachToRecyclerView(recyclerView);

        adapter.setOnItemClickListener(new UserAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(User user) {
                Intent intent = new Intent(MainActivity.this, AddEditUserActivity.class);
                intent.putExtra(AddEditUserActivity.EXTRA_ID, user.getId());
                intent.putExtra(AddEditUserActivity.EXTRA_NAME, user.getName());
                intent.putExtra(AddEditUserActivity.EXTRA_FAMILY, user.getFamily());
                intent.putExtra(AddEditUserActivity.EXTRA_LICENSE_PLATE, user.getLicensePlate());
                intent.putExtra(AddEditUserActivity.EXTRA_DOCUMENT, user.getDocument());
                intent.putExtra(AddEditUserActivity.EXTRA_ADDRESS, user.getAddress());
                intent.putExtra(AddEditUserActivity.EXTRA_TIME, user.getTime());
                startActivityForResult(intent, EDIT_USER_REQUEST);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == ADD_USER_REQUEST && resultCode == RESULT_OK) {
            assert data != null;
            String name = data.getStringExtra(AddEditUserActivity.EXTRA_NAME);
            String family = data.getStringExtra(AddEditUserActivity.EXTRA_FAMILY);
            String licensePlate = data.getStringExtra(AddEditUserActivity.EXTRA_LICENSE_PLATE);
            String document = data.getStringExtra(AddEditUserActivity.EXTRA_DOCUMENT);
            String address = data.getStringExtra(AddEditUserActivity.EXTRA_ADDRESS);
            String time = data.getStringExtra(AddEditUserActivity.EXTRA_TIME);

            User user = new User(
                    name,
                    family,
                    licensePlate,
                    document,
                    address,
                    time
            );
            userViewModel.insert(user);

            Toast.makeText(this, "User saved", Toast.LENGTH_SHORT).show();
        } else if (requestCode == EDIT_USER_REQUEST && resultCode == RESULT_OK) {
            assert data != null;
            int id = data.getIntExtra(AddEditUserActivity.EXTRA_ID, -1);
            
            if (id == -1) {
                Toast.makeText(this, "User couldn't be updated", Toast.LENGTH_SHORT).show();
                return;
            }

            String name = data.getStringExtra(AddEditUserActivity.EXTRA_NAME);
            String family = data.getStringExtra(AddEditUserActivity.EXTRA_FAMILY);
            String licensePlate = data.getStringExtra(AddEditUserActivity.EXTRA_LICENSE_PLATE);
            String document = data.getStringExtra(AddEditUserActivity.EXTRA_DOCUMENT);
            String address = data.getStringExtra(AddEditUserActivity.EXTRA_ADDRESS);
            String time = data.getStringExtra(AddEditUserActivity.EXTRA_TIME);

            User user = new User(
                    name,
                    family,
                    licensePlate,
                    document,
                    address,
                    time
            );
            user.setId(id);
            userViewModel.update(user);

            Toast.makeText(this, "User updated", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "User not saved", Toast.LENGTH_SHORT).show();
        }
    }
}

这里是 AddEditUserActivity:

package com.example.citadelentrance;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.time.LocalDateTime;
import java.util.Objects;

public class AddEditUserActivity extends AppCompatActivity {
    public static final String EXTRA_ID = "com.example.citadelentrance.EXTRA_ID";
    public static final String EXTRA_NAME = "com.example.citadelentrance.EXTRA_NAME";
    public static final String EXTRA_FAMILY = "com.example.citadelentrance.EXTRA_FAMILY";
    public static final String EXTRA_LICENSE_PLATE = "com.example.citadelentrance.EXTRA_LICENSE_PLATE";
    public static final String EXTRA_DOCUMENT = "com.example.citadelentrance.EXTRA_DOCUMENT";
    public static final String EXTRA_ADDRESS = "com.example.citadelentrance.EXTRA_ADDRESS";
    public static final String EXTRA_TIME = "com.example.citadelentrance.EXTRA_TIME";

    private EditText editTextName, editTextFamily,
            editTextLicensePlate, editTextDocument, editTextAddress;
    private TextView textViewTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_user);

        editTextName = findViewById(R.id.edit_text_name);
        editTextFamily = findViewById(R.id.edit_text_family);
        editTextLicensePlate = findViewById(R.id.edit_text_license_plate);
        editTextDocument = findViewById(R.id.edit_text_document);
        editTextAddress = findViewById(R.id.edit_text_address);
        textViewTime = findViewById(R.id.text_view_time);

        Objects.requireNonNull(getSupportActionBar()).setHomeAsUpIndicator(R.drawable.ic_close);

        Intent intent = new Intent();

        if (intent.hasExtra(EXTRA_ID)) {
            setTitle("Edit User");
            editTextName.setText(intent.getStringExtra(EXTRA_NAME));
            editTextFamily.setText(intent.getStringExtra(EXTRA_FAMILY));
            editTextLicensePlate.setText(intent.getStringExtra(EXTRA_LICENSE_PLATE));
            editTextDocument.setText(intent.getStringExtra(EXTRA_DOCUMENT));
            editTextAddress.setText(intent.getStringExtra(EXTRA_ADDRESS));
            textViewTime.setText(intent.getStringExtra(EXTRA_TIME));
        } else {
            setTitle("Add User");
            textViewTime.setText(LocalDateTimeConverter.toDateString(LocalDateTime.now()));
            Log.println(Log.ASSERT, "CS50x", "Add user activity");
        }
    }

    private void saveUser() {
        String name = getTextFromEdit(editTextName);
        String family = getTextFromEdit(editTextFamily);
        String licensePlate = getTextFromEdit(editTextLicensePlate);
        String document = getTextFromEdit(editTextDocument);
        String address = getTextFromEdit(editTextAddress);
        String time = textViewTime.toString();

        if (name.isEmpty() || family.isEmpty() || licensePlate.isEmpty() ||
                document.isEmpty() || address.isEmpty()) {
            Toast.makeText(this, "Please don't leave empty fields", Toast.LENGTH_SHORT).show();
            return;
        }

        Intent data = new Intent();
        data.putExtra(EXTRA_NAME, name);
        data.putExtra(EXTRA_FAMILY, family);
        data.putExtra(EXTRA_LICENSE_PLATE, licensePlate);
        data.putExtra(EXTRA_DOCUMENT, document);
        data.putExtra(EXTRA_ADDRESS, address);
        data.putExtra(EXTRA_TIME, time);

        int id = getIntent().getIntExtra(EXTRA_ID, -1);
        if (id != -1) {
            data.putExtra(EXTRA_ID, id);
            Log.println(Log.ASSERT, "CS50x", "id != -1");
        }

        setResult(RESULT_OK, data);
        finish();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.menu_save_user, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.getItemId() == R.id.save_user) {
            saveUser();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private String getTextFromEdit(EditText editText) {
        return editText.getText().toString().trim();
    }
}

@arget 的评论是正确的 - 你需要改变这个:

Intent intent = new Intent();

至此

Intent intent = getIntent();

或直接使用。

另一件事,你为什么不让用户 class 实现 Parcelable,并传递用户而不是它的所有属性?这将使代码更清晰。