Почему мой .putExtra не передает информацию? - PullRequest
0 голосов
/ 11 июля 2020

Я создаю приложение, похожее на приложение для заметок. У меня есть действие, которое называется AddEditUserActivity, и, как следует из его названия, оно добавляет ИЛИ редактирует user (объект, который я создал). Когда я нажимаю user в RecyclerView, я должен перейти от go к AddEditUserActivity и увидеть 5 полей, заполненных информацией о выбранном user с заголовком действия как «Редактировать пользователя». . Когда я создаю нового пользователя, я должен go выполнить то же действие, но с пустыми полями и «Добавить пользователя» в качестве заголовка. Создание пользователя работает нормально, но когда я пытаюсь его отредактировать, действие отображается с заголовком «Добавить пользователя» и пустыми полями.

Странно то, что я реализовал некоторые всплывающие сообщения типа «Пользователь обновлено »и« Создано пользователем », и они отображаются тогда, когда должны. Думаю, что проблема в MainActivity. Когда я нажимаю на пользователя, я putExtra перехожу к намерению, а затем вызываю startActivityForResult(EDIT_USER_REQUEST, intent). В AddEditUserActivity внутри onCreate я указал, что если у намерения есть специфицированное c extra (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();
    }
}

1 Ответ

1 голос
/ 11 июля 2020
Комментарий

@ arget правильный - вам нужно изменить это:

Intent intent = new Intent();

на это

Intent intent = getIntent();

или использовать его напрямую.

Другое дело, почему бы вам не заставить класс пользователя реализовывать Parcelable и не передавать пользователю все его свойства? Это сделало бы код чище.

...